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

地址 https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/

地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。
一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),
也不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格 [35, 37] ,
因为3+5+3+7=18。但它不能进入方格 [35, 38],
因为3+5+3+8=19。请问该机器人能够到达多少个格子?

 

示例 1:

输入:m = 2, n = 3, k = 1
输出:3
示例 2:

输入:m = 3, n = 1, k = 0
输出:1
提示:

1 <= n,m <= 100
0 <= k <= 20

 

解法  dfs遍历所有可能的格子

class Solution {
public:
    vector<vector<int>> vis;
    int addx[4] = {1,-1,0,0};
    int addy[4] = {0,0,-1,1};
    int ans;
    
    int Sumxy(int a){
        int ret = 0;
        while(a!=0){
            ret += a%10;
            a=a/10;
        }
        return ret;
    }
    
    void dfs(int x,int y,int k)
    {
        if( (Sumxy(x)+Sumxy(y)) >k || vis[x][y] == 1) return;
        
        vis[x][y]=1;
        ans++;
        
        for(int i = 0; i <4;i++){
            int newx = x+addx[i];
            int newy = y+addy[i];
            if(newx>=0 && newx<vis.size() && newy >=0 && newy < vis[0].size() && vis[newx][newy] == 0){
                dfs(newx,newy,k);
            }
        }
        
        return;
    }
    
    
    int movingCount(int m, int n, int k) {
        vis = vector<vector<int>>(m,vector<int>(n)); 
        dfs(0,0,k);
        
        return ans;
    }
};

 //==========================================================================================

下面 来看看BFS

class Solution {
public:
    queue<pair<int,int>> q;
    int addx[4] = {1,-1,0,0};
    int addy[4] = {0,0,1,-1};
    vector<vector<int>> vis;
    int ans;
    
    int Sumxy(int a){
        int ret = 0;
        while(a!=0){
            ret += a%10;
            a=a/10;
        }
        return ret;
    }
    
    int movingCount(int m, int n, int k) {
        q.push({0,0});
        vis = vector<vector<int>>(m,vector<int>(n));
        vis[0][0]= 1;
        
        while(!q.empty()){
            pair<int,int> XY = q.front();q.pop();
            if(Sumxy(XY.first)+Sumxy(XY.second) >k) continue;
            ans++; 
            for(int i = 0;i < 4;i++){
                int newx = XY.first+addx[i];
                int newy = XY.second+addy[i];
                
                if(newx>=0 && newx<m && newy>=0 && newy<n && 0 == vis[newx][newy]){
                    vis[newx][newy] = 1;
                    q.push({newx,newy});
                }
            }
        }
        
        return ans;
    }
};

 

posted on 2021-01-07 23:43  itdef  阅读(176)  评论(0编辑  收藏  举报

导航