剑指offer(66)机器人的运动范围

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));
		
	}

}

猜你喜欢

转载自blog.csdn.net/hxl0925/article/details/89356060
今日推荐