老鼠出迷宫详解(人人能搞懂)

常见问题:

 

小伙伴们在第一次遇到该问题时,思路大家都能清楚,就是遇到走不通的时候就换方向走,但是却不知道代码是如何走的。

解决问题:

代码如下:

                        

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;
			
			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();
			}
			Mouse t1 = new Mouse();
			t1.findway(map,1,1);
			System.out.println("===============");
			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 Mouse{
	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 {
				return false;
			}	
	}

代码分析:

        这段代码主要用二维数组生成一个地图,其中1表示围墙。不可走。0表示可以走。

  

 这段代码主要是判短老鼠如何走。然后下面就是对这段代码的一个分析:(其中1表示地图不能走,0表示地图可以走,老鼠通过0后,将该位置改为2

         当执行t1.findway(map,1,1);  将i=1,j=1带入方法,执行第一个if语句:

 if(map[ 6 ][ 5 ] ==2) {
            return true;
        }

很明显不满足条件,执行他的else语句:

 else 
            if(map[ i ][ j ] == 0 ){
                map[ i ][ j ] =2;
                if(findway(map,i+1,j)) {
                    return true;
                }

 这里就是判断map[1][1]是否为0,为0说明地图可以走,老鼠走后把该位置赋值为2.同时继续执行

 if(findway(map,i+1,j)) {
                    return true;
                }

这个意思就是继续向下走,同时调用方法,也返回一个true。然后重复执行

 else 
            if(map[ i ][ j ] == 0 ){
                map[ i ][ j ] =2;
                if(findway(map,i+1,j)) {
                    return true;
                }

向下走两次以后得到如图所示

 在想向下走的时候会发现是个1(一堵墙)于是(这里就是一个关键,很多伙伴就卡在这里)

此时i=3,j=1;因为

 if(map[ 6 ][ 5 ] ==2) {
            return true;
        }

这段代码不满足,所以返回一个flase,(为什么返回flase可以向上面看代码)此时的flase是返回调用者 :

findway(map,2+1,j) 

所以

findway(map,2+1,j)  = flase;

等同于:

   if(findway(map,2+1,j)) {
                    return true;
                }

   if(flase) {
                    return true;
                }

,所以执行下面的if语句

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

同理可以得如何执行的上下左右。

运行结果如下:

1111111
1200001
1222001
1112001
1002001
1002001
1002221
1111111

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麋鹿会飞但不飘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值