剑指 Offer 13. 机器人的运动范围

剑指 Offer 13. 机器人的运动范围

这题需要注意它和前一题的不同之处。前一题是要求搜索问题,已经搜索到的单词的字母,如'A',在这一轮的搜索中没有被用上,但是可能从'A'的上一步的其他方向可能又走到'A',所以要恢复现场。
但是这里要统计的不是是否可以达,而是要统计可达的格子数,格子如果已经走了这里,就不能在尝试从其他方向走过来了,所以不需要恢复现场。

class Solution {
    private static final int[] dx = new int[]{-1, 0, 1, 0};
    private static final int[] dy = new int[]{0, -1, 0, 1};
    int ans = 0;
    public int movingCount(int m, int n, int k) {
        boolean[][] visted = new boolean[m][n];
        backtrack(m, n, k, 0, 0, visted);
        return ans;
    }


    private void backtrack(int m, int n, int k, int x, int y, boolean[][] visted) {
        if(getDigitSum(x, y) <= k) {
            ans++;
        } else {
            return ;
        }
        visted[x][y] = true;
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if(nx < 0 || nx >= m || ny < 0 || ny >= n || visted[nx][ny]) {
                continue;
            } else {
                backtrack(m, n, k, nx, ny, visted);
            }
        }
        // visted[x][y] = false;
    }

    private int getDigitSum(int x, int y) {
        return x / 10 + x % 10 + y / 10 + y % 10;
    }
}
posted @ 2022-01-29 23:53  NullPointer_C  阅读(41)  评论(0)    收藏  举报