题目描述
地上有一个 m 行和 n 列的方格,横纵坐标范围分别是 0∼m−1 和 0∼n−1。
一个机器人从坐标 (0,0) 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格。
但是不能进入行坐标和列坐标的数位之和大于 k 的格子。
请问该机器人能够达到多少个格子?
样例1
输入:k=7, m=4, n=5
输出:20
样例2
输入:k=18, m=40, n=40
输出:1484
解释:当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
注意
- $0 \leq m \leq 50$
- $0 \leq n \leq 50$
- $0 \leq k \leq 100$
思路:宽搜。。。没什么好说的,st数组判断点是否走过。因为数组开小了卡了半天。。晕。。。
完整代码:
class Solution {
public:
int getSum(int x, int y)
{
int sum = 0;
while(x > 0)
{
sum += x % 10;
x /= 10;
}
while(y > 0)
{
sum += y % 10;
y /= 10;
}
return sum;
}
int movingCount(int threshold, int rows, int cols)
{
const int N = 60;
pair<int, int> q[N * N];
bool st[N][N];
int hh = 0, tt = -1, cnt = 0;
int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};
q[++ tt] = {0, 0};
st[0][0] = true;
int x, y;
while(hh <= tt)
{
auto t = q[hh ++];
for(int i = 0; i < 4;i ++ )
{
x = t.first + dx[i], y = t.second + dy[i];
if(!st[x][y] && x >= 0 && y >= 0 && x < rows && y < cols && getSum(x, y) <= threshold)
{
st[x][y] = true;
q[++ tt] = {x, y};
cnt++;
}
}
}
if(rows == 0 && cols == 0) return cnt;
return cnt + 1;
}
};