public class Solution {
public int movingCount(int threshold, int rows, int cols) {
return dfs(threshold,0,0,rows,cols,new boolean[rows][cols]) ;
}
/*
从坐标i , j出发所能到达最多的格子数
*/
public int dfs(int threshold , int i , int j , int rows , int cols ,boolean isvisit[][]) {
if(i < 0 || i >= rows || j < 0 || j >= cols) {
return 0 ;
}
if(isvisit[i][j]) {
return 0 ;
}
if(bitSum(i,j) > threshold) {
return 0 ;
}
isvisit[i][j] = true ;
int[] maxTemp = new int[4] ;
maxTemp[0] = dfs(threshold,i-1,j,rows,cols,isvisit) ;
maxTemp[1] = dfs(threshold,i+1,j,rows,cols,isvisit) ;
maxTemp[2] = dfs(threshold,i,j-1,rows,cols,isvisit) ;
maxTemp[3] = dfs(threshold,i,j+1,rows,cols,isvisit) ;
int sum = 0 ;
//所有路径中经过的格子之和
for(int k = 0 ; k < 4 ; k ++) {
sum += maxTemp[k] ;
}
//isvisit[i][j] = false ; 这里不必还原现场,因为需求是统计及其所有路径中能到的格子总数,
//每个格子只能计算一次,如果还原现场则每个格子可能会被计算多次
return sum+1 ;
}
//求坐标的数位之和
public int bitSum(int r , int c) {
int sum = 0 ;
while(r != 0) {
sum += (r % 10 );
r /= 10 ;
}
while(c != 0) {
sum += (c % 10) ;
c /= 10 ;
}
return sum ;
}
}