用的是dfs,bfs也可以但我没写
1.题解区大佬的
太复杂了,我是想不到数位和的计算。。
分析
数位和:数位和的部分我觉得自己想一下现推就好了,记不住公式
搜索方向简化:
参考写出的代码
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;
this.visited = new boolean[m][n];
return dfs(0, 0, 0, 0);
}
public int dfs(int i,int j,int si,int sj){
if(i<0||i>m-1||j<0||j>n-1||(si+sj)>k||visited[i][j]==true) return 0;
visited[i][j]=true;
//这次的+下边的+右边的
return 1+dfs(i+1,j,(i+1)%10==0?si-8:si+1,sj)+dfs(i,j+1,si,(j+1)%10==0?sj-8:sj+1);
}
}
结果
2.我的
平平无奇的dfs
代码
class Solution {
private int count=0;
private int m;
private int n;
private int[][] map;
public int movingCount(int m, int n, int k) {
this.m=m;
this.n=n;
this.map=new int[m][n];
//初始化
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
map[i][j]=0;
}
}
dfs(0,0,k);
return count;
}
public boolean dfs(int i,int j,int k){
//越界 或 数位和大于k 或 已访问过 或 所有位都被访问过
if(i<0||i>m-1||j<0||j>n-1||(i%10+i/10+j%10+j/10)>k||map[i][j]==1||count==m*n) return false;
//到达格子+1
count++;
if(count==m*n) return true;
//标记为已访问过
map[i][j]=1;
//移动
dfs(i+1,j,k);
dfs(i-1,j,k);
dfs(i,j+1,k);
dfs(i,j-1,k);
return true;
}
}