面试题13:机器人的运动范围

题目:地上有一个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;
	}
}

 

佛系求赞^..^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值