地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
解析:
//回溯法 其实就是递归的使用,,,与求二叉树的路径深度等问题类似,值得注意的是上下左右选择时候四个方向都放回后count+1,不能对每个方向都执行+1.
public class movingCount {
public int movingCount(int threshold,int rows,int cols) {
if(threshold<0||rows<0||cols<0)
return 0;
boolean[] visit=new boolean[rows*cols];
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++) {
visit[i*cols+j]=false;
}
int count = movingCountCore(threshold,rows,cols,0,0,visit);
return count;
}
private int movingCountCore(int threshold, int rows, int cols, int row,int col,boolean[] visit) {
// TODO Auto-generated method stub
int count=0;
if(row>=0 && row<rows &&col>=0 &&col<cols && !visit[row*cols+col] &&
(gitDigitSum(row)+gitDigitSum(col))<=threshold) {
count=1+movingCountCore(threshold,rows,cols,row+1,col,visit)
+movingCountCore(threshold,rows,cols,row+1,col,visit)
+movingCountCore(threshold,rows,cols,row+1,col,visit)
+movingCountCore(threshold,rows,cols,row+1,col,visit);
}
return count;
}
private int gitDigitSum(int row) {
// TODO Auto-generated method stub
int sum=0;
while(row>0){
sum+=row%10;
row-=row%10;
row = row/10;
}
return 0;
}
}