题解 | #机器人的运动范围#

机器人的运动范围

https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8

欢迎关注我的博客:https://www.cnblogs.com/Cloud-king/

#include <cstring>
#include <unistd.h>
class Solution {
public:
    int swsum(int x){
        int ans=0;
        while (x>=1) {
            ans+=x%10;
            x/=10;
        }
        return ans;
    }
    int vis[105][105]={0};
    int nex[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
    int ans=1;
    void dfs(int th,int x,int y,int n,int m){
        for(int i=0;i<4;i++){
            int dx=x+nex[i][0];
            int dy=y+nex[i][1];
            int tmp=swsum(dx)+swsum(dy);  
            //cout << dx << " " << dy << endl;  
            if(dx<n&&dx>=0&&dy>=0&&dy<m&&tmp<=th&&vis[dx][dy]==0){     
                vis[dx][dy]=1;
                ans++;               
                //cout << dx << " " << dy << " " << ans << endl;
                dfs(th,dx,dy,n,m);
                //vis[dx][dy]=0;  //重复的格子也能走;
            }
        }
    }
    int movingCount(int threshold, int rows, int cols) {
        memset(vis, 0, sizeof(vis));
        vis[0][0]=1;
        dfs(threshold,0,0,rows,cols);
        return ans;
    }
};

不需要回溯,只需要一个变量记录那些搜索过程中遇到的能到的格子,因为题目只是记录能到达的格子数量而不是一条可行的不能回头的路径。感觉更适合bfs去做。

#include <cstring>
#include <queue>
#include <unistd.h>
#include <utility>
class Solution {
public:
    int swsum(int x){
        int ans=0;
        while (x>=1) {
            ans+=x%10;
            x/=10;
        }
        return ans;
    }
    int vis[105][105]={0};
    int nex[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
    int ans=0;
    void bfs(int th,int n,int m){
        queue<pair<int,int>> q;
        q.push({0,0});
        while (!q.empty()) {
            pair<int, int> tmp=q.front();
            q.pop();    //不要忘记pop
            ans++;
            for(int i=0;i<4;i++){
                int dx=tmp.first+nex[i][0];
                int dy=tmp.second+nex[i][1];
                int su=swsum(dx)+swsum(dy);
                if(dx>=0&&dx<n&&dy>=0&&dy<m&&su<=th&&vis[dx][dy]==0){
                    q.push({dx,dy});
                    vis[dx][dy]=1;
                }
            }
        }
    }
    int movingCount(int threshold, int rows, int cols) {
        memset(vis, 0, sizeof(vis));
        vis[0][0]=1;
        bfs(threshold, rows, cols);
        return ans;
    }
};
全部评论

相关推荐

01-07 16:20
已编辑
门头沟学院 软件测试
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
2024-12-02 22:46
已编辑
投票
羊麻烦:学历拖累你太多了
投递菜鸟集团等公司8个岗位
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务