Java递归解决简单老鼠出迷宫问题(补充回溯现象)

  • 目的: 老鼠的起始位置是map[1][1],通过一定的策略,躲避障碍物走到终点map[5][5]
  • 说明:(1)创建二维数组map[7][7],1代表障碍物,0代表空地,2代表正确的路径,3代表当前格子是死路,不能再重复走当前的格子。

                  (2)走到map[5][5]就算是成功找到了一条路

                  (3)类为T,两个方法showmap(显示表格) 和findway(找路)

  • 策略:    立足于当前格子,首先考虑向下走,若不能走,再考虑向右走,向上,向左。

  • 运行示例

 

        代码如下(有详细的注解)

public class Migong
{
	public static void main(String [] args)
	{
		int map[][] = new int[7][7];
		for(int i=0;i<map.length;i++)//创建数组把迷宫布置好
		{
			for(int j=0;j<map[i].length;j++)
			{
				if(i==0||i==map.length-1||j==0||j==map[i].length-1)
				map[i][j] = 1;
				else map[i][j] = 0;
			}
		}
		map[3][1]=1;map[3][2]=1;//map[4][3]=1;map[4][4]=1;//到这里就把障碍物设置完啦
		T t1 = new T();
		
		System.out.println("=====原来的迷宫地图=====\n");
		t1.showmap(map);//打印出来看看
		t1.findway(map,1,1);//当前位置是map[1][1],传进去之后就执行findway方法
		
		System.out.println("=====找到路之后的迷宫,2为路=====\n");
		t1.showmap(map);//找完了,打印看看正确路径。
	}
}
class T
{
	
	public void showmap(int map[][])
	{
		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();
		}
	}
	
	//障碍物是1,
	//空地为0,
	//正确的路径置为2,
	//走过 但是确定没有这个格子没有出路就把这个格子置为3.
	public boolean findway(int map[][],int i,int j)//这里的i,j是指当前位置
	{
		//什么时候终止呢?直到我的终点map[5][5]变成了2
		//就说明打通了一条路
		if(map[5][5]==2) return true;
		else{
			if(map[i][j]==0)//如果是空地,就考虑执行下面的代码
			{
				map[i][j]=2;//假设这就是正确路径,先置为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;//此路不通
				}
				//这里很重要,上下左右都走不通,所以就不是正确路径,
				//但是防止以后再走到该位置,就置为3,那么以后就不会考虑执行了
			}
			else //map[i][j]==1/2/3,这些情况都不考虑执行,返回false
			return false;
		}
	}
}

  • 回溯现象补充:我们知道,递归一次其实是相当于在栈区新开了一块独立的栈,在如下测试案例中,我们把map[2][2]也改成障碍物,也就是改成1。那么由以上的代码可知,我们从map[1][1]出发,第一步会把map[1][1]置为2,然后向下走,到达map[2][1]然后老鼠想向下走,不通,向右不通,向上也不通(因为我们设定的是遇到格子里的数是1,2,3都是代表不通的,而map[1][1]=2,所以不通),向左也不通,这个时候就有一个现象发生,叫做回溯。
  • 我们会回溯到上一个开的栈,也就是回到了map[1][1],继续向右走(因为策略是下->右->上->左,向下走已经试过了,所以回溯之后,就会向右走)
  • 所以我们说,置为3这个做法是很有讲究滴

 

 


当然,通过改变不同的策略,比如改为右->下->上->左,得到的路径就是不一样的

这里就是我们的策略部分 

所以有不同路径,又引出了最短路径问题,后续文章会发布相关最短路径问题的解答鸭

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.别止步春天.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值