机器人运动的范围(BFS)

机器人运动的范围(BFS)

/*	剑指Offer13 机器人的运动范围
 * 	题目描述:地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。
 * 			一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),
 * 			  也不能进入行坐标和列坐标的数位之和大于k的格子。
 *  解题思路:
 *  		广度优先搜索,首先将00点入栈,然后将栈顶元素的可访问点入栈将栈顶元素出栈,直到栈空。
 * 
 * */
public class JiQiRenDeYunDongFanWei {
	public static void main(String[] args) {
		JiQiRenDeYunDongFanWei_Solution solution = new JiQiRenDeYunDongFanWei_Solution();
		System.out.println(solution.movingCount(3, 1, 0));
	}
}

class JiQiRenDeYunDongFanWei_Solution {
    public int movingCount(int m, int n, int k) {
    	//声明节果
    	int result = 0;
    	//创建map标记已被访问过的点
    	boolean[][] map = new boolean[m][n];
    	//声明栈
    	Stack<Integer[]> stack = new Stack<Integer[]>();
    	//将首元入栈
    	stack.push(new Integer[] {0,0});
    	result++;
    	map[0][0] = true;
    	while(stack.size()!=0) {
    		//将目标点出栈,上下左右四个方向的合法(下标不越界、未被访问过,不大于k)入栈
    		Integer[] temp = stack.pop();
    		int i = temp[0];
    		int j = temp[1];
    		if(j-1>=0 && toSum(i, j-1)<=k && map[i][j-1]==false) {
    			//up
    		//	System.out.println("up");
    			stack.push(new Integer[] {i,j-1});
    			map[i][j-1] = true;
    			result++;
    		}if(j+1<n && toSum(i, j+1)<=k && map[i][j+1]==false) {
    			//down
    		//	System.out.println("down");
    			stack.push(new Integer[] {i,j+1});
    			map[i][j+1] = true;
    			result++;
    		}if(i-1>=0 && toSum(i-1, j)<=k && map[i-1][j]==false) {
    			//left
    		//	System.out.println("left");
    			stack.push(new Integer[] {i-1,j});
    			map[i-1][j] = true;
    			result++;
    		}if(i+1<m && toSum(i+1, j)<=k && map[i+1][j]==false) {
    			//right
    		//	System.out.println("right");
    			stack.push(new Integer[] {i+1,j});
    			map[i+1][j] = true;
    			result++;
    		}
    	}
    	return result;
    }
    /* 输入两个介于1~100的int型数,要求返回这两个数按位拆开后的和
     * */
    public int toSum(int n,int m) {
    	String[] str_n = (n+"").split("");
    	String[] str_m = (m+"").split("");
    	int sum=0;
    	for (String string : str_n) {
			sum+=Integer.parseInt(string);
		}
    	for (String string : str_m) {
			sum+=Integer.parseInt(string);
		}
    	return sum;
    } 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值