题目描述
地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
//思路:深度优先遍历
public class Solution {
int[][]next={{0,-1},{0,1},{-1,0},{1,0}};
int count=0,rows,cols,threshold;
int[][]digitSum;
public int movingCount(int threshold, int rows, int cols)
{
this.rows=rows;
this.cols=cols;
this.threshold=threshold;
initSumOne();
boolean[][]marked=new boolean[rows][cols];
dfs(marked,0,0);
return count;
}
public void dfs(boolean[][]marked,int r,int c){
if(c>=cols||c<0||r>=rows||r<0||marked[r][c])
return;
marked[r][c]=true;
if(digitSum[r][c]>threshold)return;
count++;
for(int[]n:next)
dfs(marked,r+n[0],c+n[1]);
}
public void initSumOne(){
int[]digitSumOne=new int[Math.max(rows,cols)];
for(int i=0;i<digitSumOne.length;i++){
int n=i;
while(n>0){
digitSumOne[i]+=n%10;
n/=10;
}
}
digitSum=new int[rows][cols];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
digitSum[i][j]=digitSumOne[i]+digitSumOne[j];
}
}