标签:show boolean using put sign 循环 for sum sensor
Given a robot cleaner in a room modeled as a grid.
Each cell in the grid can be empty or blocked.
The robot cleaner with 4 given APIs can move forward, turn left or turn right. Each turn it made is 90 degrees.
When it tries to move into a blocked cell, its bumper sensor detects the obstacle and it stays on the current cell.
Design an algorithm to clean the entire room using only the 4 given APIs shown below.
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(); }
Example:
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 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.
Notes:
dfs + backtracking
初始从(0, 0)开始,用dirs数组表示上下左右,把走过的位置信息编码成string,用set记录,用visited数组标记当前位置是否被访问过
在dfs函数里:
因为初始位置永远是可达的,先调用clean(),然后把当前位置加入visited。
遍历dirs中的四个方向(循环4次,每次递归函数传进来的dir是上一次的方向,dir + i是当前方向,为防止越界,对dir + i 取余,即 (dir + i ) % 4),对于每个方向,先判断一下这个新位置是否被访问过,以及是否能到达(用clean()),如果都满足,则调用递归函数。每次遍历完一个方向,robot turn right。
调用完递归函数后,注意还要把方向转回原来的方向。即先转180度,前进一步move(),再转180度回到原来方向。
time: O(m * n), space: O(m * n) -- m, n: row, col of grid
/** * // This is the robot‘s control interface. * // You should not implement it, or speculate about its implementation * interface 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. * public boolean move(); * * // Robot will stay in the same cell after calling turnLeft/turnRight. * // Each turn will be 90 degrees. * public void turnLeft(); * public void turnRight(); * * // Clean the current cell. * public void clean(); * } */ class Solution { int[][] dirs = new int[][]{{-1,0},{0,1},{1,0},{0,-1}}; // top, right, down, left public void cleanRoom(Robot robot) { Set<String> visited = new HashSet<>(); dfs(robot, visited, 0, 0, 0); } private void dfs(Robot robot, Set<String> visited, int cur_dir, int row, int col) { robot.clean(); StringBuilder sb = new StringBuilder(); sb.append(row); sb.append("->"); sb.append(col); visited.add(sb.toString()); for(int i = 0; i < 4; i++) { int next_dir = (cur_dir + i) % 4, next_row = row + dirs[next_dir][0], next_col = col + dirs[next_dir][1]; StringBuilder next = new StringBuilder(); next.append(next_row); next.append("->"); next.append(next_col); if(!visited.contains(next.toString()) && robot.move()) { dfs(robot, visited, next_dir, next_row, next_col); robot.turnLeft(); robot.turnLeft(); robot.move(); robot.turnLeft(); robot.turnLeft(); } robot.turnRight(); } } }
489. Robot Room Cleaner - Hard
标签:show boolean using put sign 循环 for sum sensor
原文地址:https://www.cnblogs.com/fatttcat/p/10080961.html