avatar

递归算法实战:迷宫问题和八皇后问题的思考与理解

简介:

迷宫问题

迷宫是非常常见的游戏,我们要从(1,1)入口出发,到达(8,8)出口,本文拟使用递归实现迷宫游戏,让计算机帮助我们找到一条路

迷宫

实现思路

  1. 首先建立地图,使用二维数组来模拟地图,数组中数值为0时候表示该地方没有走过,为1表示红色的围墙,为2表示走得通,为3表示该路是死路
  2. 到达一个地方的时候,我们先使其数值为2假设走得通,再去判断该位置的上下左右位置是否能走通,如果都走不通就置当前位置为3,是一条死路
  3. 当出口处的数值为2的时候表明到达终点,游戏结束

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import java.util.Random;

public class MazeGame {

public boolean setWay(int[][] map,int i,int j,int endPoint_i,int endPoint_j){
/*
* @描述: 判断当前位置各个方位是否有路可走
* @参数注释:
* @param map 二维数组当做地图
* @param i
* @param j [i,j]表示当前位置
* @返回值 boolean 返回值为true就说明有路可走,否则无路可走
*/

//如果终点(6,5)数值变成了2,说明路径形成,直接返回true
//if else用来保证终点一旦到达就不用进行判断回溯了,不会像八皇后那样不停的返回所有路径
if (map[endPoint_i][endPoint_j] == 2){
return true;
}
else {
//如果当前路没有走过就走上去,直接置其数值为2
if (map[i][j] == 0){
//首先把当前通路设置成2
map[i][j] = 2;
//再来判断各个方向是不是可以走通
//先判断下方有没有路
if (setWay(map,i+1,j,endPoint_i,endPoint_j))
return true;
//判断右方有没有路
else if (setWay(map,i,j+1,endPoint_i,endPoint_j))
return true;
//判断左方有没有路
else if (setWay(map,i,j-1,endPoint_i,endPoint_j))
return true;
//判断上方有没有路
else if (setWay(map,i-1,j,endPoint_i,endPoint_j))
//判断下方有没有路
return true;

else{
//如果都没有路,那就是死路,置为3
map[i][j] = 3;
return false;
}
}
else
return false;
}
}

//该方法用来打印地图
public void printMap(int[][] map,int ROW,int COLUMN){
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COLUMN; j++) {
System.out.print(map[i][j]);
}
System.out.println();
}
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
public class StartMazeGame {
public static void main(String[] args) {
//定义地图的大小,也就是二维数组的大小
final int ROW = 10;
final int COLUMN = 10;

//定义迷宫的起始点(1,1)和终点(6,5)
final int startPoint_i = 1;
final int startPoint_j = 1;
final int endPoint_i = 8;
final int endPoint_j = 8;

//定义地图
int[][] map = new int[ROW][COLUMN];
//设置路障第一列和最后一列设置为1
for (int i = 0; i < ROW; i++) {
map[i][0] = 1;
map[i][COLUMN - 1] = 1;
}
//设置路障第一行和最后一行为1
for (int j = 0; j < COLUMN; j++) {
map[0][j] = 1;
map[ROW - 1][j] = 1;
}

//设置更多围墙
map[3][1] = 1;
map[3][2] = 1;
map[1][8] = 1;
map[7][1] = 1;
map[7][2] = 1;
map[5][3] = 1;
map[6][3] = 1;
map[2][4] = 1;
map[2][6] = 1;
map[2][7] = 1;
map[3][4] = 1;
map[4][4] = 1;
map[4][5] = 1;
map[4][7] = 1;

//开始打印地图
System.out.println("初始的地图为:");
MazeGame maze = new MazeGame();
maze.printMap(map,ROW,COLUMN);

//开始走迷宫
maze.setWay(map,startPoint_i,startPoint_j,endPoint_i,endPoint_j);
System.out.println("走完迷宫后的地图为:");
maze.printMap(map,ROW,COLUMN);

}
}

实现结果:

走完迷宫后的地图为:
1111111111
1202220011
1222121101
1113122001
1333112101
1331002001
1331002001
1110002001
1000002221
1111111111

思考

如果修改setWay函数中上下左右的顺序,那么结果也会不一样,可以亲自试一试

那么这就带来一个问题,如何求取最短路径呢

文章作者: Dxwell
文章链接: https://dxwell886.github.io/2020/07/29/%E9%80%92%E5%BD%92%E7%AE%97%E6%B3%95%E5%AE%9E%E6%88%98%EF%BC%9A%E8%BF%B7%E5%AE%AB%E9%97%AE%E9%A2%98%E5%92%8C%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98%E7%9A%84%E6%80%9D%E8%80%83%E4%B8%8E%E7%90%86%E8%A7%A3/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Dxwell的博客
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论