“`java
class Solution {
public int wardrobeFinishing(int m, int n, int cnt) {
if (cnt == 0) {
return 1;
}
Queue queue = new LinkedList<>();
//向右和向下的数组
int[] dx = {0, 1};
int[] dy = {1, 0};
boolean[][] vis = new boolean[m][n];
queue.offer(new int[]{0, 0});
int ans = 1;
vis[0][0] = true;
while (!queue.isEmpty()) {
int[] arr = queue.poll();
for (int i = 0; i < 2; i++) {
int x = dx[i] + arr[0];
int y = dy[i] + arr[1];
if (x < 0 || x >= m || y < 0 || y >= n || vis[x][y] || get(x) + get(y) > cnt) {
continue;
}
queue.offer(new int[]{x, y});
vis[x][y] = true;
ans++;
}
}
return ans;
}
public int get(int x) {
int res = 0;
while (x != 0) {
res += x%10;
x /=10;
}
return res;
}
class Solution {
int m,n,k;
boolean[][] visited;
public int movingCount(int m, int n, int k) {
this.m=m;
this.n=n;
this.k=k;
visited = new boolean[m][n];
return dfs(0,0);
}
int dfs(int i, int j){
if(i<0||i>=m||j<0||j>=n||visited[i][j]true||k<(sum(i)+sum(j))){
return 0;
}
visited[i][j]=true;
int tmp = 1+dfs(i,j+1)+dfs(i+1,j)+dfs(i,j-1)+dfs(i-1,j);
return tmp;
}
int sum(int i){
int res = 0;
while(i!=0){
res =res+i%10;
i=i/10;
}
return res;
}
java
class Solution {
public static int count = 0;
public int movingCount(int m, int n, int k) {
//定义数组来存放该元素是否已被访问
boolean[][] visited = new boolean[m][n];
return dfs(0, 0, m, n, k, visited);
//return count;
}
public int dfs(int i, int j, int m, int n, int k, boolean[][] visited) {
//不满足判断条件剪枝,在边界外时,数位之和大于时, 节点已经访问过时
if(i >= m || j >= n || visited[i][j] || bitSumGreater(i, j, k)) {
return 0;
}
count++; //将第一次访问到的该节点计数
visited[i][j] = true; //表示已经访问过了该节点
//只需要往下往右就能探索到所有可访问的节点
//dfs(i+1, j, m, n, k, visited);
//dfs(i, j+1, m, n, k, visited);
return 1 + dfs(i+1, j, m, n, k, visited) + dfs(i, j+1, m, n, k, visited);
}
public boolean bitSumGreater(int i, int j, int k) {
int sum = 0;
while(i != 0) {
sum += i % 10;
i /= 10;
}
while(j != 0) {
sum += j % 10;
j /= 10;
}
if(sum > k) {
return true;
}
return false;
}
}
class Solution {
char **mark;
int m, n, k;
void dfs(int i, int j) {
if (i < 0 || i >= m || j < 0 || j >= n || !(mark[i][j] & 1) || (mark[i][j] & 2)) return;
mark[i][j] |= 2; // mark visited
// visit neighbors
dfs(i + 1, j);
dfs(i, j + 1);
}
bool confirm(int i, int j) {
int sum = 0;
while(i) {sum += i % 10; i /= 10;}
while(j) {sum += j % 10; j /= 10;}
return (sum <= k);
}
public:
int movingCount(int m, int n, int k) {
this->m = m;
this->n = n;
this->k = k;
// initialize mark matrix && to_visit set
mark = new char*[m];
for (int i = 0; i < m; i++) {
mark[i] = new char[n];
for (int j = 0; j < n; j++) mark[i][j] = confirm(i, j);
}
dfs(0, 0);
int sum = 0;
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
sum += (mark[i][j] & 2) >> 1;
return sum;
}
};
“`C++
int digitSum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
int dfs(std::vector<std::vector>& visited, int row, int col, int m, int n, int k) {
if (row < 0 || row >= m || col < 0 || col >= n || visited[row][col] || digitSum(row) + digitSum(col) > k) {
return 0;
}
visited[row][col] = true;
int count = 1;
count += dfs(visited, row - 1, col, m, n, k);
count += dfs(visited, row + 1, col, m, n, k);
count += dfs(visited, row, col - 1, m, n, k);
count += dfs(visited, row, col + 1, m, n, k);
return count;
}
int movingCount(int m, int n, int k) {
std::vector<std::vector> visited(m, std::vector(n, false));
return dfs(visited, 0, 0, m, n, k);
}
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
class Solution {
bool satify(int x, int y, int k)
{
int res=0;
while(x)
{
res+=x%10;
x/=10;
}
while(y)
{
res+=y%10;
y/=10;
}
return res<=k;
}
void dfs(vector<vector<int>>& v, int x, int y, int k, int m, int n)
{
res++;
if(x==m-1&&y==n-1) return;
for(int i=0;i<4;i++)
{
int a=x+dx[i];
int b=y+dy[i];
// cout<<a<<" "<<b<<" "<<satify(a,b,k)<<endl;
if(a>=0&&a<m && b>=0&&b<n && v[a][b]==1 && satify(a,b,k))
{
// cout<<a<<" "<<b<<endl;
v[a][b]=0;
dfs(v, a, b, k, m, n);
}
}
}
int res;
public:
int movingCount(int m, int n, int k) {
res = 0;
vector<vector<int>> v(m, vector<int>(n, 1));
v[0][0]=0;
dfs(v, 0, 0, k, m, n);
return res;
}
};
class Solution:
def movingCount(self, m: int, n: int, k: int) -> int:
visited = [[0] * n for _ in range(m)]
def digitSum(num):
digitS = 0
while num > 0:
digitS += num % 10
num //= 10
return digitS
def dfs(i, j):
if i < 0 or i >= m or j < 0 or j >= n or digitSum(i) + digitSum(j) > k or visited[i][j]:
return 0
visited[i][j] = True
return 1 + dfs(i + 1, j) + dfs(i, j + 1)
return dfs(0, 0)
boolean[][] visited;
int m,n;
int res = 0;
int[][] directions = {{1,0},{0,1}};
public int movingCount(int m, int n, int k) {
visited = new boolean[m][n];
this.m = m;
this.n = n;
dfs(0,0,k);
return res;
}
private void dfs(int i, int j, int k){
if(i < 0 || i >= m || j < 0 || j >= n) return;
if(visited[i][j]) return;
if(sum(i,j) > k) return;
res++;
visited[i][j] = true;
for(int[] d : directions){
dfs(i+d[0],j+d[1],k);
}
// visited[i][j] = false;
}
private int sum(int x, int y){
int count = 0;
while(x > 0){
count += x % 10;
x /= 10;
}
while(y > 0){
count += y % 10;
y /= 10;
}
return count;
}
//时间复杂度:O(mn) 空间复杂度:O(mn)
class Solution {
public:
int movingCount(int m, int n, int k) {
vector<vector<bool>> visited(m, vector<bool>(n, 0));
return dfs(0, 0, 0, 0, visited, m, n, k);
}
private:
int dfs(int i, int j, int si, int sj, vector<vector<bool>> &visited, int m, int n, int k) {
if(i >= m || j >= n || k < si + sj || visited[i][j]) return 0;
visited[i][j] = true;
return 1 + dfs(i + 1, j, (i + 1) % 10 != 0 ? si + 1 : si - 8, sj, visited, m, n, k) +
dfs(i, j + 1, si, (j + 1) % 10 != 0 ? sj + 1 : sj - 8, visited, m, n, k);
}
};
class Solution {
public int movingCount(int m, int n, int k) {
int ans = 0;
boolean[][] seen = new boolean[m][n];
for (int i = 0; i < m; i++) {
if (getSum(i, 0) <= k) {
seen[i][0] = true;
ans++;
} else {
break;
}
}
for (int i = 1; i < n; i++) {
if (getSum(0, i) <= k) {
seen[0][i] = true;
ans++;
} else {
break;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (getSum(i, j) <= k && (seen[i - 1][j] || seen[i][j - 1])) {
seen[i][j] = true;
ans++;
}
}
}
return ans;
}
private int getSum(int m, int n) {
int ans = 0;
while (m > 0) {
ans += m % 10;
m /= 10;
}
while (n > 0) {
ans += n % 10;
n /= 10;
}
return ans;
}
}
共以下 13 个回答
“`java queue = new LinkedList<>();
class Solution {
public int wardrobeFinishing(int m, int n, int cnt) {
if (cnt == 0) {
return 1;
}
Queue
//向右和向下的数组
int[] dx = {0, 1};
int[] dy = {1, 0};
boolean[][] vis = new boolean[m][n];
queue.offer(new int[]{0, 0});
int ans = 1;
vis[0][0] = true;
while (!queue.isEmpty()) {
int[] arr = queue.poll();
for (int i = 0; i < 2; i++) { int x = dx[i] + arr[0]; int y = dy[i] + arr[1]; if (x < 0 || x >= m || y < 0 || y >= n || vis[x][y] || get(x) + get(y) > cnt) {
continue;
}
queue.offer(new int[]{x, y});
vis[x][y] = true;
ans++;
}
}
return ans;
}
}
class Solution {
int m,n,k;
boolean[][] visited;
public int movingCount(int m, int n, int k) {
this.m=m;
this.n=n;
this.k=k;
visited = new boolean[m][n];
return dfs(0,0);
}
int dfs(int i, int j){
if(i<0||i>=m||j<0||j>=n||visited[i][j]true||k<(sum(i)+sum(j))){
return 0;
}
visited[i][j]=true;
int tmp = 1+dfs(i,j+1)+dfs(i+1,j)+dfs(i,j-1)+dfs(i-1,j);
return tmp;
}
递归
时间复杂度O(MN), 空间复杂度O(N+M)
时间复杂度:O(mn)
空间复杂度:O(mn)
【思路】用深度优先遍历
【复杂度】时间复杂度O(mn),空间复杂度O(mn)
C++实现
“`C++
int digitSum(int num) {
int sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return sum;
}
int dfs(std::vector<std::vector>& visited, int row, int col, int m, int n, int k) {
if (row < 0 || row >= m || col < 0 || col >= n || visited[row][col] || digitSum(row) + digitSum(col) > k) {
return 0;
}
}
int movingCount(int m, int n, int k) {> visited(m, std::vector (n, false));
std::vector<std::vector
return dfs(visited, 0, 0, m, n, k);
}
“`
复杂度O(mn)
右下
向右向下。
MY广度遍历,
可以只向下,向右遍历
模拟
时间:O(mn)
空间:O(mn)