LeetCode

LeetCode

  • Problems
  • GitHub

›Problems

Problems

  • Two Sum
  • Add Two Numbers
  • Longest Substring Without Repeating Characters
  • Reverse Integer
  • String to Integer (atoi)
  • Palindrome Number
  • Longest Common Prefix
  • 3Sum
  • Remove Nth Node From End of List
  • Valid Parentheses
  • Merge Two Sorted Lists
  • Generate Parentheses
  • Merge k Sorted Lists
  • Remove Element
  • Next Permutation
  • Search in Rotated Sorted Array
  • Valid Sudoku
  • Group Anagrams
  • Maximum Subarray
  • Search a 2D Matrix
  • Binary Tree Level Order Traversal
  • Maximum Depth of Binary Tree
  • Balanced Binary Tree
  • Best Time to Buy and Sell Stock
  • Binary Tree Maximum Path Sum
  • Valid Palindrome
  • Word Ladder
  • Longest Consecutive Sequence
  • Palindrome Partitioning II
  • Linked List Cycle
  • Find Minimum in Rotated Sorted Array
  • Two Sum II - Input Array Is Sorted
  • Number of Islands
  • Reverse Linked List
  • Course Schedule II
  • Kth Largest Element in an Array
  • Contains Duplicate
  • Count Complete Tree Nodes
  • Invert Binary Tree
  • Valid Anagram
  • Find the Duplicate Number
  • Count of Smaller Numbers After Self
  • Longest Increasing Path in a Matrix
  • Top K Frequent Elements
  • Decode String
  • Longest Repeating Character Replacement
  • Max Consecutive Ones
  • Cracking the Safe
  • Binary Search
  • Design Circular Queue
  • Robot Room Cleaner
  • Peak Index in a Mountain Array
  • Fruit Into Baskets
  • Sort Array By Parity II
  • Unique Email Addresses
  • K Closest Points to Origin
  • Squares of a Sorted Array
  • Remove Vowels from a String
  • Optimize Water Distribution in a Village
  • Duplicate Zeros
  • Defanging an IP Address
  • Find Numbers with Even Number of Digits
  • Shuffle the Array
  • Running Sum of 1d Array
  • Number of Good Pairs
  • Richest Customer Wealth
  • Build Array from Permutation
  • Concatenation of Array
  • Final Value of Variable After Performing Operations
  • Maximum Number of Words Found in Sentences
  • Add Two Integers
  • Intersection of Two Arrays
  • Missing Number
  • Jewels and Stones
  • Find a Corresponding Node of a Binary Tree in a Clone of That Tree
  • Kids With the Greatest Number of Candies
  • Design Parking System
  • Minimum Sum of Four Digit Number After Splitting Digits
  • Root Equals Sum of Children
  • Plus One
  • Validate Binary Search Tree
  • Find Pivot Index
  • Largest Number At Least Twice of Others
  • Range Sum of BST
  • Subtract the Product and Sum of Digits of an Integer
  • How Many Numbers Are Smaller Than the Current Number

Robot Room Cleaner

Description

You are controlling a robot that is located somewhere in a room. The room is modeled as an m x n binary grid where 0 represents a wall and 1 represents an empty slot.

The robot starts at an unknown location in the room that is guaranteed to be empty, and you do not have access to the grid, but you can move the robot using the given API Robot.

You are tasked to use the robot to clean the entire room (i.e., clean every empty cell in the room). The robot with the four given APIs can move forward, turn left, or turn right. Each turn is 90 degrees.

When the robot tries to move into a wall cell, its bumper sensor detects the obstacle, and it stays on the current cell.

Design an algorithm to clean the entire room using the following APIs:

interface Robot {
  // returns true if next cell is open and robot moves into the cell.
  // returns false if next cell is obstacle and robot stays on the current cell.
  boolean move();

// Robot will stay on the same cell after calling turnLeft/turnRight. // Each turn will be 90 degrees. void turnLeft(); void turnRight();

// Clean the current cell. void clean(); }

Note that the initial direction of the robot will be facing up. You can assume all four edges of the grid are all surrounded by a wall.

 

Custom testing:

The input is only given to initialize the room and the robot's position internally. You must solve this problem "blindfolded". In other words, you must control the robot using only the four mentioned APIs without knowing the room layout and the initial robot's position.

 

Example 1:

Input: room = [[1,1,1,1,1,0,1,1],[1,1,1,1,1,0,1,1],[1,0,1,1,1,1,1,1],[0,0,0,1,0,0,0,0],[1,1,1,1,1,1,1,1]], row = 1, col = 3
Output: Robot cleaned all rooms.
Explanation: All grids in the room are marked by either 0 or 1.
0 means the cell is blocked, while 1 means the cell is accessible.
The robot initially starts at the position of row=1, col=3.
From the top left corner, its position is one row below and three columns right.

Example 2:

Input: room = [[1]], row = 0, col = 0
Output: Robot cleaned all rooms.

 

Constraints:

  • m == room.length
  • n == room[i].length
  • 1 <= m <= 100
  • 1 <= n <= 200
  • room[i][j] is either 0 or 1.
  • 0 <= row < m
  • 0 <= col < n
  • room[row][col] == 1
  • All the empty cells can be visited from the starting position.

Solution(javascript)

/**
 * // This is the robot's control interface.
 * // You should not implement it, or speculate about its implementation
 * function Robot() {
 *     // Returns true if the cell in front is open and robot moves into the cell.
 *     // Returns false if the cell in front is blocked and robot stays in the current cell.
 *     @return {boolean}
 *     this.move = function() {
 *         ...
 *     };
 *
 *     // Robot will stay in the same cell after calling turnLeft/turnRight.
 *     // Each turn will be 90 degrees.
 *     @return {void}
 *     this.turnLeft = function() {
 *         ...
 *     };
 * 
 *     // Robot will stay in the same cell after calling turnLeft/turnRight.
 *     // Each turn will be 90 degrees.
 *     @return {void} 
 *     this.turnRight = function() {
 *         ...
 *     };
 *
 *     // Clean the current cell.
 *     @return {void}
 *     this.clean = function() {
 *         ...
 *     };
 * };
 */

/**
 * @param {Robot} robot
 * @return {void}
 */
var cleanRoom = function(robot) {
  let dir = 0;

  const cleaned = {};
  const flipDir = d => (d + 2) % 4;
  const turnRight = () => { robot.turnRight(); dir = (dir + 1) % 4; };
  const setDir = (newDir) => { while (dir !== newDir) turnRight(); };

  const recurse = (x, y, moveDir) => {
    robot.clean();

    if (cleaned[x + " : " + y] === true) return;
    moveDir >= 0 && setDir(moveDir);

    if (moveDir >= 0 && !robot.move()) {
      return;
    } else {
      cleaned[x + " : " + y] = true;

      // visit all non-clean adjacent squares
      recurse(x, y - 1, 0);
      recurse(x + 1, y, 1);
      recurse(x, y + 1, 2);
      recurse(x - 1, y, 3);
    }
    
    // move back to our last square
    moveDir >= 0 && setDir(flipDir(moveDir));
    moveDir >= 0 && robot.move();
  };

  recurse(0, 0, -1);
};
← Design Circular QueuePeak Index in a Mountain Array →
  • Description
  • Solution(javascript)
Powered By LeetCode Site Generator