示例 1:
输入:m = 2, n = 3, k = 1
输出:3
示例 1:
输入:m = 3, n = 1, k = 0
输出:1
提示:
1 <= n,m <= 100
0 <= k <= 20
Solutions
dfs
class Solution {
public:
int m, n;
vector<bool> visited;
inline int sum(int n) {
int s = 0;
while (n) {
s += n % 10; n /= 10;
}
return s;
}
int dfs(int i, int j, int k) {
if (i >= m || j >= n || visited[i * n + j] || sum(i) + sum(j) > k) return 0;
visited[i * n + j] = true;
return dfs(i + 1, j, k)
+ dfs(i, j + 1, k)
+ 1;
}
int movingCount(int m, int n, int k) {
this->m = m; this->n = n;
visited = vector<bool>(m * n);
return dfs(0, 0, k);
}
};
bfs
class Solution {
public:
inline int sum(int n) {
int s = 0;
while (n) {
s += n % 10; n /= 10;
}
return s;
}
int movingCount(int m, int n, int k) {
vector<bool> visited(m * n);
queue<pair<int, int>> q;
q.push({0, 0});
int num = 0, i, j;
while (q.size()) {
auto [x, y] = q.front(); q.pop();
num++;
i = x + 1, j = y;
if (!(i >= m || j >= n || visited[i * n + j]
|| sum(i) + sum(j) > k)) {
visited[i * n + j] = true;
q.push({i, j});
}
i = x, j = y + 1;
if (!(i >= m || j >= n || visited[i * n + j]
|| sum(i) + sum(j) > k)) {
visited[i * n + j] = true;
q.push({i, j});
}
}
return num;
}
};