489. Robot Room Cleaner 机器人扫地

这个相当于一个图遍历问题, 每个点最多有四个edge,用move()来判断有没有这个edge。自建坐标来标记这些点。
所以就是一个传统的DFS + 自已构建坐标
比较容易出错的地方是转向问题。
我第一次写的时候写了好长的代码。
后来第二次短了一些,第三次就现在这么短,而且是一遍过。
我前几次没有保存机器人的方向,很容易出错。这次我加了一个变量表示现在的方向,
逻辑立马清楚许多了。

class Solution {
    int[][] OFFSETS;
    public void cleanRoom(Robot robot) {
        OFFSETS = new int[][]{{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
        int dir = 0;
        Map> visited = new HashMap<>();
        dfs(robot, visited, 0, 0, dir);
        return;
    }
    private void dfs(Robot robot, Map> visited, int row, int col, int dir) {
        if (visited.get(row) != null && visited.get(row).contains(col)) return;
        visited.putIfAbsent(row, new HashSet<>());
        visited.get(row).add(col);
        robot.clean();
        int curDir = dir;
        for (int i = 0; i < 4; i++) {
            int[] os = OFFSETS[curDir % 4];
            if (robot.move()) {
                dfs(robot, visited, row + os[0], col + os[1], curDir);
                robot.turnRight(); //调头返回,一定不能忘了 
                robot.turnRight();
                robot.move();//返回 
                robot.turnRight();
                robot.turnRight();
            }
            robot.turnRight();
            curDir += 1;
            curDir %= 4;
        }
    }
}

你可能感兴趣的:(489. Robot Room Cleaner 机器人扫地)