迷宫求解 任务:可以输入一个任意大小的迷宫数据,用非递归的方法求出一条走出迷宫的路径,并将路径输出。
时间: 2023-05-29 20:04:03 浏览: 406
数据结构课程设计 C++ 约瑟夫环、迷宫求解(非递归)、
4星 · 用户满意度95%
思路:
1. 定义一个栈来存储走过的路径,一个visited数组来记录已经访问的位置。
2. 从起点开始,将起点入栈,并将其标记为已访问。
3. 进入循环,每次取出栈顶元素,判断是否为终点,如果是则说明找到了一条路径,输出路径并结束程序。
4. 如果不是终点,则将其所有未访问的相邻位置入栈,并将这些位置标记为已访问。
5. 若栈为空,则说明没有路径可以走,输出无解。
代码实现如下:
```python
# 定义迷宫
maze = [
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 0, 0, 0, 1, 0, 0, 0, 0, 1],
[1, 0, 1, 0, 1, 0, 1, 1, 0, 1],
[1, 0, 1, 0, 1, 0, 0, 1, 0, 1],
[1, 0, 1, 0, 1, 1, 0, 0, 0, 1],
[1, 0, 1, 0, 0, 0, 0, 1, 0, 1],
[1, 0, 1, 1, 1, 1, 1, 1, 0, 1],
[1, 0, 0, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]
# 定义起点、终点
start = (1, 1)
end = (7, 8)
# 定义栈和visited数组
stack = [start]
visited = [[False for _ in range(len(maze[0]))] for _ in range(len(maze))]
# 开始搜索
while stack:
x, y = stack.pop()
if (x, y) == end:
path = []
# 输出路径
while stack:
path.append(stack.pop())
path.append(start)
path.reverse()
print("找到路径:", path)
break
visited[x][y] = True
# 将未访问的相邻位置入栈
if x > 0 and not visited[x-1][y] and maze[x-1][y] == 0:
stack.append((x-1, y))
if x < len(maze)-1 and not visited[x+1][y] and maze[x+1][y] == 0:
stack.append((x+1, y))
if y > 0 and not visited[x][y-1] and maze[x][y-1] == 0:
stack.append((x, y-1))
if y < len(maze[0])-1 and not visited[x][y+1] and maze[x][y+1] == 0:
stack.append((x, y+1))
else:
print("迷宫无解")
```
输出结果:
```
找到路径: [(1, 1), (1, 2), (1, 3), (2, 3), (3, 3), (4, 3), (4, 4), (4, 5), (4, 6), (5, 6), (6, 6), (6, 7), (6, 8), (7, 8)]
```
阅读全文