本实战技能模拟迷宫问题的求解,在迷宫某处放一大块奶酪,把一只老鼠放入迷宫。迷宫以二维数组表示,0表示墙,1表示老鼠可以移动的路径。老鼠不能离开迷宫或翻墙,从用户指定的位 置开始移动,判断老鼠是否能走出迷宫。
该实战技能要求输入老鼠出发的起始位置,输出老鼠是否能走出迷宫的结果。运行程序得 到的结果如下图所示。
老鼠走迷宫结果展示
【技术要点】
本实战技能的技术难点在于回溯法的运用。回溯法的原理,即发现当前的候选解不可能是解 时,就放弃它而选择下一个候选解。如果当前的候选解除了不满足问题的要求外,其他所有要求都已满足,则扩大当前候选解的规模继续试探。
如果当前的候选解满足了问题的所有要求,则这个候选解将成为问题的一个解。
在求解本案例迷宫问题的过程中,如果发现老鼠进入死胡同,就回溯一步或多步,寻找其他路径。
【主体设计】
利用回溯法实现老鼠走迷宫的流程如下图所示。
老鼠走迷宫实现流程图
实现老鼠走迷宫具体通过以下3个步骤实现。
Step1:设定一个迷宫地图,即一个二维数组,1为可以行走的路,0为不能行走的路。
Step2:判断当前方向是否可以走,若不行则回溯到上一步,将走过的路标记为2;若可以则判 断是否到达终点,没有则继续走,直到没有路可以走。
Step3:判断老鼠是否走到终点,若没有到达终点,则输出“走不出迷宫”,否则输出“成功走出迷宫”。
【编程实现】
本实战技能使用PyCharm工具进行编写,建立相关的源文件【老鼠走迷宫.py】,在界 面输入代码。参考下面的详细步骤,编写具体代码,具体步骤及代码如下所示。
Step1:创建一个列表作为迷宫的地图,代码如下所示。
1. maze = [[1, 1, 0, 1, 0, 1],
2. [1, 1, 1, 0, 1, 0],
3. [0, 0, 1, 0, 1, 0],
4. [0, 1, 1, 1, 0, 0],
5. [0, 0, 0, 1, 1, 0],
6. [1, 0, 0, 0, 0, 0]]
Step2:定义map( )函数,确保老鼠不会走出迷宫的范围并且判断当前这条路是否通畅,代码如下所示。
1. def map(maze, x, y):
2. if (x >= 0 and x < len(maze) and y >= 0 and y < len(maze[0]) and maze[x][y] == 1):
3. return True
4. else:
5. return False
Step3:定义一个move( )函数,此函数有两个功能,一是用来判断老鼠是否走出迷宫;二是用 来模拟老鼠的行走路径。为了防止老鼠原路返回,将走过的路标记为2,代码如下所示。
1. def move(maze, x, y):
2. if(x == 0 and y == 0):
3. print(" 能够走出迷宫 ") # 判断是否走到迷宫出口
4. return True
5. if map(maze, x, y):
6. maze[x][y] = 2 # 防止原路返回
7. if not move(maze, x-1, y): # 对四个方向进行试探,判断哪个方向可以走,
8. # 如果都不行则撤回
9. maze[x][y] = 1
10. elif not move(maze, x, y - 1):
11. maze[x][y] = 1
12. elif not move(maze, x 1, y):
13. maze[x][y] = 1
14. elif not move(maze, x, y 1):
15. maze[x][y] = 1
16. else:
17. return False
18. return True
Step4:接收用户定义的老鼠的起点位置,输出是否能够走出迷宫,代码如下所示。
1. print(" 老鼠走迷宫案例 ")
2. a = int(input(" 起始位置的行坐标 :"))
3. b = int(input(" 起始位置的列坐标 :"))
4. move(maze, a, b)
5. if maze[0][1] == 1 and maze[1][0] == 1:
6. print(" 走不出迷宫 ") # 判断第 0 行和第 1 列或者第 1 行和第 0 列是否为 1,
7. # 若为 1 说明已经到达终点,若不为 1 则未到达终点
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved