地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?
class SolutionMethod1{
public int movingCount(int threshold,int rows,int cols){//threshold 约束值,rows 方格行数,cols 方格列数,
boolean[] visted = new boolean[rows*cols];
for(int i = 0; i < visted.length; i++)
visted[i] = false;
int count = movingCountCore(threshold,rows,cols,0,0,visted);
return count; //最多可走的方格数
}
public int movingCountCore(int threshold,int rows,int cols,int row,int col,boolean[] visted){
//threshold 约束值 ;rows 方格行数;cols 方格列数;row 当前处理的行号;col 当前处理的列号;visted 访问标记数组
int count = 0;
if(check(threshold,rows,cols,row,col,visted)){
visted[row*cols + col] = true;
count = 1 + movingCountCore(threshold,rows,cols,row - 1,col,visted) +
movingCountCore(threshold,rows,cols,row,col - 1,visted) +
movingCountCore(threshold,rows,cols,row + 1,col,visted) +
movingCountCore(threshold,rows,cols,row,col + 1,visted);
}
return count; //最多可走的方格数
}
boolean check(int threshold,int rows,int cols,int row,int col,boolean[] visted){
if(row >= 0 && row < rows && col >= 0 && col < cols
&& (getDigitSum(row) + getDigitSum(col) <= threshold)
&& !visted[row* cols + col])
return true;
return false;
}
public int getDigitSum(int number){ //number 数字
int sum = 0;
while(number > 0){
sum += number%10;
number /= 10;
}
return sum; //数字的位数之和
}
}
public class Solution {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入限制条件k:");
int k = scanner.nextInt();
System.out.println("请输入方格的行数m:");
int m = scanner.nextInt();
System.out.println("请输入方格的列数n:");
int n = scanner.nextInt();
SolutionMethod1 solution1 = new SolutionMethod1();
scanner.close();
System.out.println("矩阵能到达的方格数是:");
System.out.println(solution1.movingCount(k, m, n));
}
}