思路
按照DFS模板来套,递归三部曲:
返回值:NULL
中间逻辑:访问位置为true,数量统计count++
返回逻辑:如果当前的和val>k或者当前位已经访问过了,直接返回.
代码
class Solution {
public:
int a[4] = { -1,1,0,0 }; //行,上下左右
int b[4] = { 0,0,-1,1 }; //列,上下左右
int count=0;
int sum(int i, int j) {
//cout << "i:" << i << "j:" << j<<",";
int val = 0;
while (i ) {
val += (i % 10) ;
i /= 10;
}
while (j) {
val += (j % 10);
j /= 10;
}
//cout<<"val:" << val << endl;
return val;
}
void dfs(int i, int j, int k, vector<vector<bool>>& vis,int m,int n) {
if (sum(i, j) > k||vis[i][j]) return;
count++;
vis[i][j] = true;
for (int p = 0; p < 4; ++p) {
int x = i + a[p];
int y = j + b[p];
if (x < 0 || y < 0 || x >= m || y >= n || vis[x][y]) continue;
dfs(x, y,k,vis,m,n);
}
}
int movingCount(int m, int n, int k) {
vector<vector<bool>> vis(m, vector<bool>(n, false));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (vis[i][j]) continue;
dfs(0, 0, k,vis,m,n);
// cout << count << endl;
}
}
return count;
}
};
但是上面的代码有一个致命的错误,题目中说机器人只能在相邻的格子内移动,也就是说,我们对于不相邻的格子,是不能访问的(这是一个大坑),也就说说我们不能使用两个for循环嵌套来遍历每一个格子,因为机器人根本就跳不过去!
更改后的代码如下:
class Solution {
public:
int a[4] = { -1,1,0,0 }; //行,上下左右
int b[4] = { 0,0,-1,1 }; //列,上下左右
int count=0;
int sum(int i, int j) {
//cout << "i:" << i << "j:" << j<<",";
int val = 0;
while (i ) {
val += (i % 10) ;
i /= 10;
}
while (j) {
val += (j % 10);
j /= 10;
}
//cout<<"val:" << val << endl;
return val;
}
void dfs(int i, int j, int k, vector<vector<bool>>& vis,int m,int n) {
if (sum(i, j) > k||vis[i][j]) return;
count++;
vis[i][j] = true;
for (int p = 0; p < 4; ++p) {
int x = i + a[p];
int y = j + b[p];
if (x < 0 || y < 0 || x >= m || y >= n || vis[x][y]) continue;
dfs(x, y,k,vis,m,n);
}
}
int movingCount(int m, int n, int k) {
vector<vector<bool>> vis(m, vector<bool>(n, false));
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (vis[i][j]) continue;
dfs(0, 0, k,vis,m,n);
// cout << count << endl;
}
}
return count;
}
};
无非就是规定说只能从0,0开始,而不是轮流两个for循环.
小结
要注意判断能不能跳入相邻的格子.