Problem
地上有一个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。请问该机器人能够到达多少个格子?
Example1
输入:m = 2, n = 3, k = 1
输出:3
Example2
输入:m = 3, n = 1, k = 0
输出:1
Solution
BFS
class Solution {
public:
int movingCount(int m, int n, int k) {
if(m == 0 && n == 0)
return 0;
int ret = 1;
if(!isValid(0,0,k))
return ret;
queue<pair<int,int>> q;
q.push(pair<int,int>(0,0));
vector<vector<int>> visited(m,vector<int>(n,0));
visited[0][0] = 1;
vector<pair<int,int>> dir = {{1,0},{0,1}};
while(!q.empty())
{
auto cur = q.front();
q.pop();
for(int i = 0;i<dir.size();++i)
{
int x = cur.first + dir[i].first;
int y = cur.second + dir[i].second;
if(x>=0 && x<m && y>=0 && y<n && !visited[x][y] && isValid(x,y,k))
{
q.push(pair<int,int>(x,y));
visited[x][y] = 1;
++ret;
}
}
}
return ret;
}
bool isValid(int x,int y,int k)
{
int sum = digitSum(x) + digitSum(y);
if(sum > k)
return false;
return true;
}
int digitSum(int x)
{
int sum = 0;
while(x)
{
sum += x % 10;
x = x/10;
}
return sum;
}
};