地上有一个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
题目链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/
思路
法一:遍历格子
对题目给的坐标要求,在格子上有2个特征可以利用:
1)机器人从原点出发;
2)左上坐标和肯定比右下小。
因此遍历每个格子,若能从左边或上面连通,且本身坐标符合要求,则当前格子可连通。
利用这个逻辑对每个格子进行判断。
class Solution {
public:
int movingCount(int m, int n, int k) {
if(k<0 ) return 0;
vector<vector<int>> rec(m, vector<int>(n,0));
rec[0][0] = 1;
int res = 0;
for(int i=0; i<m; ++i){
if(getnum(i)<=k){
++res;
rec[i][0] = 1;
}else break;
}
for(int j=1; j<n; ++j){
if(getnum(j)<=k){
++res;
rec[0][j] = 1;
}else break;
}
for(int i=1; i<m; ++i){
int sub = k - getnum(i);
if(sub<0){
break;
}
for(int j=1; j<n; ++j){
if(( rec[i-1][j]>0 || rec[i][j-1]>0 ) && getnum(j)<=sub){
++res;
rec[i][j] = 1;
}
}
}
return res;
}
int getnum(int num){
int res = 0;
while(num>0){
res += num%10;
num /= 10;
}
return res;
}
};
法二:BFS模拟行走
和其他BFS题类似,暂时不写代码。