- 目的: 老鼠的起始位置是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这个做法是很有讲究滴
当然,通过改变不同的策略,比如改为右->下->上->左,得到的路径就是不一样的
这里就是我们的策略部分
所以有不同路径,又引出了最短路径问题,后续文章会发布相关最短路径问题的解答鸭