class Solution { //BFS
public:
int count = 0;
int movingCount(int m, int n, int k) {
vector<vector<int>> flag(m, vector<int> (n, 0));
helper(m, n, k, 0, 0, flag);
return count;
}
private:
void helper(int m, int n, int k, int row, int col, vector<vector<int>> &flag) {
if(row >= 0 && row < m && col >= 0 && col < n &&
flag[row][col] != 1 && check(row) + check(col) <= k) {
count++;
flag[row][col] = 1;
helper(m, n, k, row + 1, col, flag);
helper(m, n, k, row, col + 1, flag);
}
/* 算法有误:结果可能大于所求
//访问所有的方格,不管符合要求(行左边+列坐标位数<=k)是否可达
//即将不可达方格包围的解也计算在内
if(row >= 0 && row < m && col >= 0 && col < n && flag[row][col] != 1) {
if(check(row) + check(col) <= k)
count++;
flag[row][col] = 1;
helper(m, n, k, row + 1, col, flag);
helper(m, n, k, row, col + 1, flag);
}
*/
return ;
}
int check(int m) {
int sum = 0;
while(m) {
sum += m % 10;
m /= 10;
}
return sum;
}
};
class Solution { //BFS
public:
int count = 0;
int movingCount(int m, int n, int k) {
vector<vector<int>> visited(m, vector<int>(n, 0));
helper(visited, m ,n, 0, 0, k);
return count;
}
private:
void helper(vector<vector<int>>& visited, int m, int n, int row, int col, int k) {
if(row == m || col == n) return ;
if(visited[row][col] == 0 && check(row, col, k)) {
count++;
visited[row][col] = 1;
helper(visited, m, n, row + 1, col, k);
helper(visited, m, n, row, col + 1, k);
}
return ;
}
bool check(int m, int n, int k) {
int sum = 0;
while(m) {
sum += m % 10;
m /= 10;
}
while(n) {
sum += n % 10;
n /= 10;
}
return sum <= k;
}
};
剑指 Offer 13. 机器人的运动范围
最新推荐文章于 2022-05-10 20:47:14 发布