老鼠出迷宫

该文章是对韩顺平的《零基础快速学Java》中P223的其中一个判断条件做出的个人解读,如有误请指出。

源码如下:

public class MiGong{
	public static void main(String[] args) {
		int[][] map = new int[8][7];
		for(int i = 0 ; i < 7 ; i++){
			map[0][i] = 1;
			map[7][i] = 1;
		}
		for(int i = 0 ; i < 8 ; i++){
			map[i][0] = 1;
			map[i][6] = 1;
		}
		map[3][1] = 1;
		map[3][2] = 1;
		map[2][1] = 2;
		for(int i = 0 ; i < map.length ; i++){
			for(int j = 0 ; j < map[i].length ; j++){
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
		System.out.println();
		T t1 = new T();
		t1.findWay(map, 1, 1);
		for(int i = 0 ; i < map.length ; i++){
			for(int j = 0 ; j < map[i].length ; j++){
				System.out.print(map[i][j] + " ");
			}
			System.out.println();
		}
	}
}
class T{
	public boolean findWay(int[][] map , int i, int j){
		if(map[6][5] == 2){
			return true;
		} else{
			if(map[i][j] == 0){
				map[i][j] = 2;
				if(findWay(map, i + 1, j)){
					return true;
				} else if(findWay(map, i, j + 1)){
					return true;
				} else if(findWay(map, i - 1, j)){
					return true;
				} else if(findWay(map, i, j - 1)){
					return true;
				} else{
					map[i][j] = 3;
					return false;
				}
			} else{ //map[i][j] = 1, 2, 3
				return false;
			}
		}
	}
}

在第37行时,本人对于判断条件是map[i][j] == 0还是map[i][j] == 0 || map[i][j] == 2想了很久,以下是个人见解。

图1

如图1所示,假设黑色为一开始就设定好的,蓝色是程序运行时被标记的。

map[i][j] == 0:假设执行到1号蓝色2时,向下、向右、向上、向左都走不了(向下为3,其他为2,即返回了false),再将1号蓝色2赋值为3,于是返回上一层递归,也就是返回到2号蓝色2,此时的递归已经判断完向下走不了,继续判断向右、向上、向左(都为2)...以此类推,直到4号蓝色2,向下判断过了,继续判断向右,向右为0可以走。优点:一条路走不通立刻回到初始位置。(以上描述称为“回溯现象”)

由此可以看出,map[i][j] == 2的意思是,之前已经判断过此路可通,但是走到最后一步的时候碰到了3,所以这条路再走判断就会多余,所以直接换条没有2的路走。

用语言表达不清楚,用人话讲就是在走迷宫的时候,你走过很长的路,虽然这一路上可以通过且没有障碍,但是最后是死路,所以下一次再路过迷宫此处的时候就不会按照相同路径再走一遍,因为走过的路会从0变为2。

(语言表达能力实在是太差了,如果有误请指出!感谢!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值