地上有一个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
示例 1:
输入:m = 3, n = 1, k = 0 输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
思路:bfs模板中的judge函数只需要再添加一个下x,y数位之和是否小于k就可以了,最后记录可以走到的格子的总数
完整代码:
class Solution {
public:
struct Node{
int x,y;
};
//向右和向下两个方向就可以走到所有格子
int X[2] = {0,1};
int Y[2] = {1,0};
bool inq[101][101] = {false};
//求数位之和
int getSum(int x,int y){
int sum = 0;
do{
sum += x%10;
x /= 10;
}while(x!=0);
do{
sum += y%10;
y /= 10;
}while(y!=0);
return sum;
}
bool judge(int x,int y,int m,int n,int k){
if(x<0||x>=m||y<0||y>=n||inq[x][y]==true)return false;
if(getSum(x,y)>k)return false;
return true;
}
//bfs模板again
int movingCount(int m, int n, int k) {
queue<Node>q;
Node s;
s.x = 0;
s.y = 0;
q.push(s);
inq[0][0] = true;
while(!q.empty()){
Node now = q.front();
q.pop();
for(int i = 0;i<2;i++){
int newx = now.x+X[i];
int newy = now.y+Y[i];
if(judge(newx,newy,m,n,k)){
Node newnode;
newnode.x = newx;
newnode.y = newy;
q.push(newnode);
inq[newx][newy] = true;
}
}
}
int cnt = 0;
for(int i = 0;i<m;i++){
for(int j = 0;j<n;j++){
if(inq[i][j])cnt++;
}
}
return cnt;
}
};