题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
思路 DFS
class Solution {
public:
int count = 0;
bool validtest(int i, int j, int threshold){
int ans = 0;
while(i){
ans += i%10;
i /= 10;
}
while(j){
ans += j%10;
j /= 10;
}
return ans <= threshold;
}
void bfs(int threshold, int rows, int cols, int i, int j, bool** used){
if( i >= 0 && i < rows
&& j >= 0 && j < cols
&& !used[i][j]
&& validtest(i, j, threshold)){
count++;
used[i][j] = true;
bfs(threshold, rows, cols, i+1, j, used);
bfs(threshold, rows, cols, i-1, j, used);
bfs(threshold, rows, cols, i, j+1, used);
bfs(threshold, rows, cols, i, j-1, used);
}
}
int movingCount(int threshold, int rows, int cols)
{
if(rows <= 0 || cols <= 0) return false;
if(threshold <= 0) return false;
//vector<vector<bool> > used(rows,vector<bool>(cols,false) );//用来存储哪些格子已经被打通了 true打通,false没走过,用这个不对,没有完全初始化为false
bool** used = new bool* [rows];
for(int i = 0; i < rows; i++) {
used[i] = new bool[cols]{false};
}
bfs(threshold, rows, cols, 0, 0, used);
return count;
}
};
本文介绍了一个机器人在限定条件下的移动问题。机器人从起点出发,在不违反数位和限制的情况下尽可能多地访问网格上的节点。通过深度优先搜索算法实现,详细展示了如何判断节点是否合法并递归地遍历所有可能的路径。
756

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



