package java_jianzhioffer_algorithm;
import java.util.Scanner;
/**
* 题目:地上有一个m行和n列的方格。
* 一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格
* 但是不能进入行坐标和列坐标的数位之和大于k的格子。
* eg: 当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。
* 但是,它不能进入方格(35,38),因为3+5+3+8 = 19。
* 请问该机器人能够达到多少个格子?
* @author hexiaoli
*思考:回溯法求解
*/
public class MovingCount {
public static int movingCount(int threshold, int rows, int cols) {
int[][] flag = new int [rows][cols];
return judge(threshold,rows,cols,0,0,flag);
}
public static int judge(int threshold, int rows, int cols,int i ,int j ,int[][] flag) {
//边界条件
if(i<0||i>=rows||j<0||j>=cols||
numSum(i) + numSum(j) > threshold || flag[i][j] == 1)
return 0;
flag[i][j] =1;
return 1+judge(threshold,rows,cols,i-1,j,flag)
+judge(threshold,rows,cols,i+1,j,flag)
+judge(threshold,rows,cols,i,j-1,flag)
+judge(threshold,rows,cols,i,j+1,flag);
}
public static int numSum(int i ) {
int sum =0;
while(i>0) {
sum += i%10;
i /= 10;
}
return sum;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int rows = input.nextInt();
int cols = input.nextInt();
int k = input.nextInt();
System.out.println(movingCount(k,rows,cols));
}
}
剑指offer(66)机器人的运动范围
猜你喜欢
转载自blog.csdn.net/hxl0925/article/details/89356060
今日推荐
周排行