Robot Move

题目地址:
http://www.1point3acres.com/bbs/thread-283570-1-1.html

题目:
题目是一个机器人在一个空间里面,不知道大小形状,也不知道初始位置。空间里有障碍物, 有一个move function, 如果前面是障碍物的话,会return false, 不是return true. 求所以可以达到位置的面积。Note: move 是真的move, 就算是障碍物也会move到那里,但是会return false。follow up 是怎么在dfs基础上再缩减call move的次数

解题思路:
这道题就是dfs然后加上两个set来存储路径和障碍物。

代码:



public int Solution() {
    Set<String> visit = new HashSet<>();
    Set<String> obs = new HashSet<>(); //障碍物    visit.add(encode(0, 0));
    dfs(0, 0, visit, obs);
    return visit.size();
}
public void dfs(int i, int j, Set<String> visit, Set<String> obs) {
    int[][] dict = new int[][]{{0, 1}, {0, -1}, {-1, 0}, {1, 0}};
    for (int k = 0; k < 4; k++) {
        int next_i = dict[k][0] + i;
        int next_j = dict[k][1] + j;
        String str = encode(next_i, next_j);
        if (obs.contains(str) || visit.contains(str)) continue;
        if (move(k)) { //move success, will move to next pos and return true.            visit.add(str)
            dfs(next_i, next_j, visit, obs);
        } else {
            obs.add(str);
        } //move() return true / false, always goes to next_i, next_j, so need to move back even move return false;        move(moveBack(k));
    }
}
public String encode(int i, int j) {
    return i + ',' + j;
}
public void moveBack(int k) {
    if (k % 2 != 0) {
        return k - 1;
    }
    return k + 1;
}

Comments

Popular Posts