【回溯专题】剑指 Offer 13. 机器人的运动范围

本问题对应课程链接:剑指offer刷题第六期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 10 个回答

  • Jimmy 普通 2024年3月31日 下午10:05

    时间复杂度O(mn),空间复杂度O(mn)

    class Solution {
    public:
        int m;
        int n;
        int k;
    
    
        int wardrobeFinishing(int m, int n, int cnt) {
            this->m = m;
            this->n = n;
            this->k = cnt;
            vector<vector<bool>> visited(m,vector<bool>(n,false));
            return dfs(0,0,visited);
        }
    
        int dfs(int i,int j, vector<vector<bool>>& visited)
        {
            if(i<0 || j<0 || i>=m || j>=n || visited[i][j] || (sum(i)+sum(j))>k)
            {
                return 0;
            }
            visited[i][j] = true;
            return 1+dfs(i,j+1,visited) + dfs(i+1,j,visited);
        }
    
        int sum(int x)
        {
            int res = 0;
            while(x != 0)
            {
                res += x%10;
                x /= 10;
            }
            return res;
        }
    };
    
    0 赞同 0 条回复
  • 白雪公主倒拔垂杨柳 永久会员 2024年3月31日 下午8:57
    class Solution {
    
        int n;//grid 行数
        int m; // 列数
        int cnt;
        boolean[][] visited;
    
        public int wardrobeFinishing(int m, int n, int cnt) {
            this.n=n;
            this.m=m;
            this.cnt=cnt;
            visited = new boolean[n][m];
    
            return dfs(0,0,cnt);
    
        }
    
        int dfs(int i,int j,int cnt){
            if(i<0 || i>=n || j<0 || j>=m ||visited[i][j]==true || digit(i)+digit(j)>cnt){
                return 0;
            }
            visited[i][j]=true;
            return 1+dfs(i+1,j,cnt)+dfs(i,j+1,cnt);//这个方向也可以访问,+1
    
    
        }
    
        int digit(int n){
            int sum=0;
            while(n!=0){
                sum+=(n%10);
                n=n/10;
            }
            return sum;
        }
    }
    

    时间复杂度:O(mn)
    空间复杂度:O(mn)

    0 赞同 0 条回复
  • Thaddeus 永久会员 2024年3月30日 下午9:34

    打卡

    class Solution {
    public:
        int wardrobeFinishing(int m, int n, int cnt) {
            if(!cnt) return 1;
            vector<vector<bool>> vis(m, vector<bool>(n, false));
            dfs(0, 0, m, n, cnt, vis);  
            return res; 
        }
    private:
        int getSum(int x) {
            int sum = 0;
            for(; x; x /= 10) sum += x % 10;
            return sum;
        }
    
        void dfs(int i, int j, int m, int n, int cnt, vector<vector<bool>>& vis) {
            if (i < 0 || j < 0 || i >= m || j >= n || vis[i][j] || getSum(i) + getSum(j) > cnt) return;
    
            res++;
            vis[i][j] = true;
            dfs(i + 1, j, m, n, cnt, vis), dfs(i, j + 1, m, n, cnt, vis);
        }
    
    private:
        int res;
    
    };
    /*
    0 1 2 3 4 5 6
    1
    2
    3
    
    */
    
    0 赞同 0 条回复
  • 言之命至 普通 2024年3月30日 上午10:33
    class Solution {
        int m;
        int n;
        int k;
        boolean[][] visited;
        public int movingCount(int m, int n, int k) {
            this.m = m;
            this.n = n;
            this.k = k;
            visited = new boolean[m][n];
    
            return dfs(0, 0);
        }
    
        int dfs(int i, int j){
            // 是否在方格之内或者是否访问过或者是否是障碍物
            if(i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || k < sum(i) + sum(j)){
                return 0;
            }
    
            visited[i][j] = true;
            return 1 + dfs(i + 1, j) + dfs(i, j + 1);
        }
    
        int sum(int x){
            int res = 0;
            while(x != 0){
                res = res + x % 10;
                x = x / 10;
            }
            return res;
        }
    }
    
    0 赞同 0 条回复
  • heathhou 普通 2024年3月29日 下午10:52
    class Solution {
    public:
        int wardrobeFinishing(int m, int n, int cnt) {
            this->m = m;
            this->n = n;
            this->k = cnt;
            this->visited.resize(m, vector<bool>(n, false));
    
            return dfs(0, 0);
        }
    
        int dfs(int i, int j){
            if(i < 0 || i >= m || j < 0 || j >= n || visited[i][j] == true || k < sum(i) + sum(j))
            return 0;
    
            visited[i][j] = true;
            return 1 + dfs(i + 1, j) + dfs(i, j + 1);
        }
    
        int sum(int x){
            int res = 0;
            while(x != 0){
                res += x % 10;
                x /= 10;
            }
            return res;
        }
    private:
        int n;
        int m;
        int k;
        vector<vector<bool>> visited;
    };
    

    时间复杂度: O(m * n)

    0 赞同 0 条回复
  • 紫芝 普通 2024年3月29日 下午6:07

    思路:dfs

    “`c++
    class Solution {
    public:
    int wardrobeFinishing(int m, int n, int cnt) {
    vector> visited(m, vector(n, false));
    return dfs(visited, 0, 0, m, n, cnt, 0, 0);
    }
    int dfs(vector> &visited, int row, int col, int m, int n, int cnt, int valr, int valc) {
    if (row >= m || col >= n || valr+valc > cnt || visited[row][col]==1) return 0;
    visited[row][col] = true;
    return 1 + dfs(visited, row+1, col, m, n, cnt, (row+1)%10==0?(valr-8):(valr+1), valc) + dfs(visited, row, col+1, m, n, cnt, valr, (col+1)%10==0?(valc-8):(valc+1));
    }
    };
    “`

    0 赞同 0 条回复
  • 方铎码农 普通 2024年3月29日 下午12:42
    class Solution {
        int m,n,cnt;
        boolean[][] visited;
        public int wardrobeFinishing(int m, int n, int cnt) {
            this.m = m; this.n = n; this.cnt = cnt;
            visited = new boolean[m][n];
            return dfs(0, 0);
        }
    
        //当前元素在矩阵中的行列索引 i 和 j
        int dfs(int i, int j) {
            if (i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || sumOfDigits(i) + sumOfDigits(j) > cnt) {
                return 0;
            }
    
            visited[i][j] = true;
            return 1 + dfs(i+1, j) + dfs(i, j+1);
        }
    
        int sumOfDigits(int x){
            int sum = 0;
            while(x != 0) {
                sum += x % 10;
                x /= 10;
            }
            return sum;
        }
    }
    

    时间复杂度$O(mn)$,空间复杂度$O(mn)$

    0 赞同 0 条回复
  • 云无深雁影 普通 2024年3月28日 上午11:25

    class Solution {
    Boolean[][] hasVisited;
    int count = 0;
    public int wardrobeFinishing(int m, int n, int cnt) {
    hasVisited = new Boolean[m][n];
    for(int i = 0; i < m; i++)
    for(int j = 0; j < n; j++)
    hasVisited[i][j] = false;
    visit(m,n,cnt,0,0);
    return count;

    }
    private void visit(int m, int n, int cnt, int x, int y){
        if(x >= m || y >= n || digit(x) + digit(y) > cnt ||hasVisited[x][y] == true)
            return;
        hasVisited[x][y] = true;
        count++;
        visit(m,n,cnt,x+1,y);
        visit(m,n,cnt,x,y+1);
    }
    private int digit(int x){
        int digit = 0;
        while(x!=0){
            digit += x % 10;
            x /= 10;
        }
        return digit;
    }
    

    }
    //时间复杂度Onm
    空间复杂度Onm

    0 赞同 0 条回复
  • 王位詮釋 普通 2024年3月27日 下午9:59
    class Solution {
        int res = 0;
        public int wardrobeFinishing(int m, int n, int cnt) {
            boolean[][] visited = new boolean[m][n];
            backtrace(m,n,0,0,cnt,visited);
            return res;
        }
        public void backtrace(int m,int n,int i,int j,int cnt,boolean[][] visited){
            if(getSum(i)+getSum(j)>cnt||visited[i][j]){
                return;
            }
            res++;
            visited[i][j] = true;
            int[][] directions = new int[][]{{0,1},{1,0}};
            for(int[] direction:directions){
                int newi = i+direction[0];
                int newj = j+direction[1];
                if(newi<m&&newi>=0&&newj<n&&newj>=0){
                    backtrace(m,n,newi,newj,cnt,visited);
                }
            }
        }
        public int getSum(int x){
            int sum = 0;
            while(x!=0){
                sum = sum + x%10;
                x/=10;
            }
            return sum;
        }
    }
    思路:回溯(深度优先搜索),定义全局变量res用来返回结果,如果当前位置没被访问过且digit(i)+digit(j)<=cnt的话就res++且访问下一个节点。
    
    0 赞同 0 条回复
  • Raphtalia. 普通 2024年3月27日 下午9:10

    class Solution {
    public:
    int wardrobeFinishing(int m, int n, int cnt) {
    vector<vector> flag(m, vector(n, 0));
    return dfs(0, 0, cnt, flag);
    }
    private:
    int digit(int x) {
    return x / 10 + x % 10;
    }
    int dfs(int x, int y, int cnt, vector<vector
    >& flag) {
    if (x >= flag.size() || y >= flag[0].size() || digit(x) + digit(y) > cnt || flag[x][y])
    return 0;
    flag[x][y] = 1;
    int res = 1 + dfs(x + 1, y, cnt, flag) + dfs(x, y + 1, cnt, flag);
    return res;
    }
    };时间空间复杂度均为O(MN)

    0 赞同 0 条回复

# 回答此问题

后才能回答