迷宫问题
作者:互联网
java初学笔记——迷宫问题
问题描述:
现在有一个迷宫,红色的是障碍物
假设有一个人在蓝色格子处,需要走到紫色格子处才能走出迷宫,本次会用到递归
如果让你现在这样看,你觉得很简单,一眼就看出来了,事实上的确如此...你有许多种走法,你甚至可以绕一圈再出去,如果你在迷宫里面呢?如果这个格子迷宫要复杂的多呢?但是现在只需要知道最简单的思路,后面的简单一些了
回到正题,仔细观察这个迷宫,有行数也有列数(感觉是废话),在基础编程语言里,能够同时存储行数和列数的——二维数组,如果将这个迷宫有二维数组表示呢?那么它就是一个八行七列的二维数组(假设数组为arr[][]),那么蓝色格子就可以用坐标表示为arr[1][1],紫色格子就可以表示为arr[6][5],现在就需要让这个人从arr[1][1]--->arr[6][5],那么,如何让计算机知道呢?
有一个简单的方法,将0设置为可以走的路,将1设置为障碍物(我只是觉得这样比较好记,你要设为其他的数,5678都行,这只是一个标志而已),即红色的部分
//1.先创建迷宫,用二维数组表示 8行7列 int[][] map = new int[8][7]; //2.0表示可以走,1表示障碍物 map[3][1] = 1; map[3][2] = 1; //3.将四周设置为障碍物 for (int i = 0; i < a; i++) { map[0][i] = 1; map[7][i] = 1; } for (int i = 0; i < a + 1; i++) { map[i][0] = 1; map[i][6] = 1; }
现在,计算机知道了边界,那么如何让它动起来?需要在设置两个数:假设2为走过的路(这个和0可以走的路意义不一样),假设3为死路(你要想设置5,6,7,8也无所谓,全看你自己),假定找到路径返回true,否则返回false,那么就有了判断出去的办法:
if (map[a][b] == 2) { return true; }
也就是说,如果终点处被设置为2,那么就一定知道到了终点,直接返回true就好了,那么,如果没有一开始找到终点怎么办?那就让他找,走过一个格子,将格子里面的数从0-->2,走一个标记一个格子,那么现在还有一件事,就是方向,你决定让他如何去找,上下左右四个方向,先去哪里?这个完全就看你了,我这里只是举一个例子,让他按照下-右-左-上的顺序去找,那么,如何让计算机知道上下左右四个方向呢--->坐标,用坐标表示,假设你在(i,j)这个点:那么
其余点的坐标就是这样,你也可以斜着找,都可以,找到坐标的规律就好了,你甚至可以自己设定一套找路径的规则,这里就不展示了,只做最基础的论述,那么,现在找的思路理清楚了,
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;
}
这就是找的路径
现在还有一个问题
就是这种情况,如果我新加了一个障碍,按照我设定的路径去找,下右都是死路,上边被找过了,怎么办--->回溯,这就是递归的特性,回到上面蓝色的格子,并且将这个格子标记为3,那么这里也就成了死路,等同于障碍物,然后再按照顺序找下去,还记得上面说过的,找到正确的返回true吗?这就是一层一层的返回,知道找到了终点,并且返回为true,一层一层的返回true,直至返回最底层,就是栈的顺序,先入后出,递归也是如此
你也可以试一下按照这个路径顺序将终点设置为(6,1),然后对照这路径图,一步一步地走,这样你会更好的理解递归
附一下完整代码:
public class Maze {
public static void main(String[] args) {
int a = 7;
//1.先创建迷宫,用二维数组表示 8行7列
int[][] map = new int[8][7];
//2.0表示可以走,1表示障碍物
map[3][1] = 1;
map[3][2] = 1;
//3.将四周设置为障碍物
for (int i = 0; i < a; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
for (int i = 0; i < a + 1; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//4.输出当前的地图
System.out.println("当前地图为:");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
//5.找路
T3 t3 = new T3();
t3.findway(map, 1, 1);
System.out.println("=========找路的路径============");
for (int[] ints : map) {
for (int anInt : ints) {
System.out.print(anInt + " ");
}
System.out.println();
}
}
}
class T3 {
static int a = 6;
static int b = 5;
static int c = 2;
public boolean findway(int[][] map, int i, int j) {
if (map[a][b] == c) {
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;
}
}
}
}
最后贴一张代码的流程图,能够帮助你理解
标签:map,return,findway,int,迷宫,else,问题,true 来源: https://www.cnblogs.com/FZLS-/p/15170466.html