题解 | #机器人的运动范围#
机器人的运动范围
https://www.nowcoder.com/practice/6e5207314b5241fb83f2329e89fdecc8
#include <vector>
class Solution {
public:
int num = 0;
int get_value(int val)
{
int res = 0;
while (val) {
res += val%10;
val /=10;
}
return res;
}
void dfs(int threshold, vector<vector<int>>& mat, vector<vector<bool>>& board, int i, int j)
{
// 到达边界、走过的、格子数值大于阈值则停止
if(i < 0 || i > mat.size() - 1|| j < 0 || j > mat[0].size() -1 || board[i][j] || get_value(i) + get_value(j) > threshold)
return;
board[i][j] = true; // 若格子可行,则标记为true
num += 1;
// 上下左右遍历找可行格子
dfs(threshold, mat, board, i - 1, j);
dfs(threshold, mat, board, i + 1, j);
dfs(threshold, mat, board, i, j - 1);
dfs(threshold, mat, board, i, j + 1);
// 添加下面会导致失败。跟JZ12相比,其考虑的是一片范围,而非单一路径。范围表示的是,走过就是走过了,未来的上下左右遍历,不再考虑走过的。
// board[i][j] = false;
// num -= 1;
return;
}
int movingCount(int threshold, int rows, int cols) {
// 记录走过的格子
vector<vector<bool>> board(rows,vector<bool>(cols, false));
//初始化行列矩阵
vector<vector<int>> mat(rows,vector<int>(cols, 0));
dfs(threshold, mat, board, 0, 0);
return num;
}
};
挤挤刷刷! 文章被收录于专栏
记录coding过程

