这道题目可以使用回溯的方法来做,但是想来想去应该有更加简洁的算法,即如下想法:
因为机器人的可达路径总是由左至右或者由上至下的方式到达,也就是说,一个地点是否可达,不仅取决于自身坐标是否符合要求,而且其左边或者上边的地点也要可达,从而可以得到以下结论:visit[i][j] = visit[i-1][j] | visit[i][j-1]; 但是在具体写代码的时候要注意到边界问题。
class Solution {
public:
int movingCount(int m, int n, int k) {
if(k == 0){
return 1;
}
vector<vector<int>> visit(m, vector<int>(n,0));
int res = 1;
visit[0][0] = 1;
for(int i = 0;i < m; ++i){
for(int j = 0;j < n; ++j){
if((i == 0 && j == 0) || (getDigitSum(i) + getDigitSum(j) > k)){
continue;
}
if(i >= 1){
visit[i][j] |= visit[i-1][j];
}
if(j >= 1){
visit[i][j] |= visit[i][j-1];
}
res += visit[i][j];
}
}
return res;
}
int getDigitSum(int n){
int res = 0;
while(n > 0){
res += (n % 10);
n /= 10;
}
return res;
}
};
本文介绍了一种简洁的算法,用于计算机器人在给定条件下从起点到终点的可达路径数量。算法利用了回溯思想,但通过判断当前位置的可达性依赖于其左侧或上方位置的可达性,实现了更高效的路径计算。
1647

被折叠的 条评论
为什么被折叠?



