题意
地上有一个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
。请问该机器人能够到达多少个格子?
题解
广度优先遍历
//C++
class Solution {
public:
int movingCount(int m, int n, int k) {
int dx[2] = {1, 0}, dy[2] = {0, 1};
int mask[m][n];
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
mask[i][j]=0;
queue<pair<int, int>> q;
q.push(make_pair(0,0));
int cnt = 1;
mask[0][0] = 1;
while(!q.empty()){
int x = q.front().first;
int y = q.front().second;
q.pop();
for(int i = 0; i < 2; i++)
{
int tmp_x = x+dx[i];
int tmp_y = y+dy[i];
if( (tmp_x < m) && (tmp_y < n) && (mask[tmp_x][tmp_y] == 0) && (isMove(tmp_x,tmp_y,k))){
q.push(make_pair(tmp_x, tmp_y));
cnt++;
mask[tmp_x][tmp_y] = 1;
}
}
}
return cnt;
}
bool isMove(int i, int j, int k){
return sumNum(i) + sumNum(j) <= k;
}
int sumNum(int number){
int sum = 0;
while(number != 0){
sum += number % 10;
number /= 10;
}
return sum;
}
};