机器人的运动范围(较难,数组)

本文介绍了一种计算机器人在限定条件下方格地图中可达格子数量的算法。机器人从起点出发,遵循特定移动规则,避免进入数位和超过阈值k的格子。通过广度优先搜索策略遍历所有可达位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
示例1
输入
5,10,10
返回值
21
查找所有满足的格子就用搜索了
需要注意的是标记数组要先赋值0,牛客的那个编译器好像不太一样,不赋值的话不知道会跑出什么数据。所以不赋值的话自测没问题,一提交就出错了。

class Solution {
public:
    struct node{
        int x,y;
    }tmp,t;
    int ok(int x,int y,int z)
    {
        int sum=0;
        while(x) sum+=x%10,x/=10;
        while(y) sum+=y%10,y/=10;
        return sum<=z;
    }
    int movingCount(int threshold, int rows, int cols) {
        if(threshold<=0) return 0;
        int sum=0,flag[rows][cols],dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
        memset(flag,0,sizeof(flag));
        flag[0][0]=1;
        tmp.x=0;tmp.y=0;
        queue<node>q;
        q.push(tmp);
        while(q.size())
        {
            int len=q.size();
            sum+=len;
            while(len--)
            {
                tmp=q.front();
                q.pop();
                for(int i=0;i<4;i++)
                {
                    t.x=tmp.x+dir[i][0];
                    t.y=tmp.y+dir[i][1];
                    if(flag[t.x][t.y]==0&&ok(t.x,t.y,threshold)&&t.x<rows&&t.y<cols&&t.x>=0&&t.y>=0)
                    {
                        flag[t.x][t.y]=1;
                        q.push(t);
                    }
                }
            }
        }
        return sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值