LeetCode(剑指 Offer)- 13. 机器人的运动范围

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 13. 机器人的运动范围相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:

解题思路

相关企业

  • Facebook

AC 代码

  • Java
// 解决方案(1)
class Solution 

    private int row, col, count, limit;

    private boolean[][] path, no;

    private int[] calc;

    public int movingCount(int m, int n, int k) 
        limit = k;
        count = 0;
        row = m;
        col = n;
        path = new boolean[m][n];
        no = new boolean[m][n];
        calc = new int[m * n];
        dfs(0, 0);
        return count;
    

    private void dfs(int i, int j) 
        if (i < 0 || i >= row || j < 0 || j >= col || path[i][j]) 
            return;
        

        path[i][j] = true;

        if (cal(i) + cal(j) <= limit) 
            count++;
         else 
            no[i][j] = true;
            // 此时站在限制位置, 必须马上回退, 这个最容易忘记
            return;
        

        // 接下来 4 个 if 为的是不进限制位置
        if (i+1 < row && !no[i+1][j]) 
            dfs(i + 1, j);
        

        if (i-1 >= 0 && !no[i-1][j]) 
            dfs(i - 1, j);
        

        if (j+1 < col && !no[i][j+1]) 
            dfs(i, j + 1);
        

        if (j-1 >= 0 && !no[i][j-1]) 
            dfs(i, j - 1);
        
    

    private int cal(int num) 
        int tnum = num;
        if (calc[tnum] != 0) 
            return calc[tnum];
        
        int sum = 0;
        while (num != 0) 
            sum += num % 10;
            num /= 10;
        
        calc[tnum] = sum;
        return sum;
    


// 解决方案(2)
class Solution 
    int m, n, k;
    boolean[][] visited;
    public int movingCount(int m, int n, int k) 
        this.m = m; this.n = n; this.k = k;
        this.visited = new boolean[m][n];
        return dfs(0, 0, 0, 0);
    
    public int dfs(int i, int j, int si, int sj) 
        if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;
        visited[i][j] = true;
        return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj) + dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8);
    


// 解决方案(3)
class Solution 
    public int movingCount(int m, int n, int k) 
        boolean[][] visited = new boolean[m][n];
        int res = 0;
        Queue<int[]> queue= new LinkedList<int[]>();
        queue.add(new int[]  0, 0, 0, 0 );
        while(queue.size() > 0) 
            int[] x = queue.poll();
            int i = x[0], j = x[1], si = x[2], sj = x[3];
            if(i >= m || j >= n || k < si + sj || visited[i][j]) continue;
            visited[i][j] = true;
            res ++;
            queue.add(new int[]  i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj );
            queue.add(new int[]  i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8 );
        
        return res;
    
  • C++
// 解决方案(1)
class Solution 
public:
    int movingCount(int m, int n, int k) 
        vector<vector<bool>> visited(m, vector<bool>(n, 0));
        return dfs(0, 0, 0, 0, visited, m, n, k);
    
private:
    int dfs(int i, int j, int si, int sj, vector<vector<bool>> &visited, int m, int n, int k) 
        if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;
        visited[i][j] = true;
        return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj, visited, m, n, k) +
                   dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8, visited, m, n, k);
    
;

// 解决方案(2)
class Solution 
public:
    int movingCount(int m, int n, int k) 
        vector<vector<bool>> visited(m, vector<bool>(n, 0));
        int res = 0;
        queue<vector<int>> que;
        que.push( 0, 0, 0, 0 );
        while(que.size() > 0) 
            vector<int> x = que.front();
            que.pop();
            int i = x[0], j = x[1], si = x[2], sj = x[3];
            if(i >= m || j >= n || k < si + sj || visited[i][j]) continue;
            visited[i][j] = true;
            res++;
            que.push( i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj );
            que.push( i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8 );
        
        return res;
    
;

以上是关于LeetCode(剑指 Offer)- 13. 机器人的运动范围的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-剑指Offer 13机器人运动

LeetCode13. 罗马数字转整数 / 剑指 Offer 42. 连续子数组的最大和 / 剑指 Offer 43. 1~n 整数中 1 出现的次数

LeetCode剑指offer记录

[LeetCode]剑指 Offer 35. 复杂链表的复制

[LeetCode]剑指 Offer 35. 复杂链表的复制

Leetcode刷题100天—剑指 Offer 50. 第一个只出现一次的字符(队列)—day13