题目描述
地上有一个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;
}
};