题目:地上有一个m行n列的方格。一个机器人从坐标(0,0)的格子开始,每次可以向上下左右移动一格,但不能进入坐标的数位之和大于k的格子。例如,k=18,机器人可以进入格子(35,37),因为3+5+3+7=18,不能进入(35,38)的格子,因为3+5+3+8=19。请问机器人可以到达多少个格子?
思路:回溯法
解法:
package question13;
public class Test1 {
public static void main(String[] args) {
System.out.println(movingCount(4,4,4));
}
private static int movingCount(int threshold, int rows, int cols) {
if(threshold<0||rows<=0||cols<=0){
return 0;
}
boolean[][] visited=new boolean[rows][cols];
int count=movingCountCore(threshold,rows,cols,0,0,visited);
visited=null;
return count;
}
//参数i,j表示现在处于第i行j列的格子
private static int movingCountCore(int threshold, int rows, int cols, int i, int j, boolean[][] visited) {
int count=0;
if(check(threshold,rows,cols,i,j,visited)){
visited[i][j]=true;
count=1+movingCountCore(threshold, rows, cols, i+1, j, visited)
+movingCountCore(threshold, rows, cols, i-1, j, visited)
+movingCountCore(threshold, rows, cols, i, j+1, visited)
+movingCountCore(threshold, rows, cols, i, j-1, visited);
}
return count;
}
private static boolean check(int threshold, int rows, int cols, int i, int j, boolean[][] visited) {
if(i>=0&&i<rows&&j>=0&&j<cols&&!visited[i][j]){
if(getDigitSum(i)+getDigitSum(j)<=threshold){
return true;
}
}
return false;
}
private static int getDigitSum(int i) {
int sum=0;
while(i>0){
sum+=i%10;
i=i/10;
}
return sum;
}
}
佛系求赞^..^