public int movingCount(int threshold, int rows, int cols)
{ //边界条件
if(rows <= 0||cols <= 0||threshold < 0)
return 0;
int[] num = {0};//保存可以到达的总格数
boolean[] visit = new boolean[rows*cols];//访问过的位置进行标记
countCore( threshold, rows,cols,0,0,num, visit);
return num[0];
}
private void countCore(int threshold,int rows,int cols,int r,int c,int[] num,boolean visit[]){
if(r>=0 && r < rows && c>=0 && c<cols && !visit[r*cols+c] && isSumBigThanK(r,c,threshold))
{
num[0]++;
visit[r*cols+c]=true;
countCore(threshold, rows,cols,r+1,c, num,visit);//向上移动
countCore(threshold, rows,cols,r-1,c, num,visit);//向下移动
countCore(threshold, rows,cols,r,c+1, num,visit);//向右移动
countCore(threshold, rows,cols,r,c-1, num,visit);//向左移动
}
}
//该方法用来比较两个数的按位和是否超过阈值
private boolean isSumBigThanK(int r,int c,int k){
int num = 0;//保存总和
while(r!=0){
num+=r;
r/=10;
}
while(c!=0){
num+=c;
c /=10;
}
if(num<=k)
return true;
return false;
}