使用队列走迷宫,并打印出路径。队列走迷宫没有回溯,话不多说,兄弟萌,上代码!
from stack_queue.loop_queue import SQueue
dirs = [(0,1),(1,0),(0,-1),(-1,0)]
def mark(maze,pos): # 给迷宫maze的位置pos标2表示"到过"
maze[pos[0]][pos[1]] = 2
def passable(maze,pos): # 检查迷宫maze的位置pos是否可行
return maze[pos[0]][pos[1]] == 0
def maze_solver_queue(maze,start,end):
"""使用队列"""
if start == end: # 特殊情况
print("Path Found")
return
qu = SQueue()
mark(maze,start)
qu.enqueue(start) # start位置入列
path_dic = {} # 记录当前位置与其前驱
while not qu.is_empty(): # 队列里还有元素
pos = qu.dequeue() # 取出队首元素
for i in range(4): # 检查每个方向
nextp = (pos[0]+dirs[i][0],pos[1]+dirs[i][1]) # 列举各位置
if nextp[0]<0 or nextp[0]>len(maze)-1 or nextp[1]<0 or nextp[1]>len(maze[0])-1:
continue
if nextp == end: # 是出口
print("Path Found") # 成功
path_dic[nextp] = pos
"""显示迷宫路径"""
item = end
path = []
while item != start:
path.append(str(path_dic[item])+'->'+str(item))
item = path_dic[item]
for i in range(len(path)):
print(path.pop())
return
if passable(maze,nextp): # 当前位置是可以访问的
path_dic[nextp] = pos
mark(maze,nextp) # 标记为已访问
qu.enqueue(nextp) # 新位置入队
print("NO PATH.") # 没有路径,失败
if __name__ == '__main__': # 测试一下
maze = [[1,1,1],[0,0,1],[1,0,0]]
start = (1,0)
end = (2,2)
maze_solver_queue(maze,start,end)
SQueue的实现在这里
测试的迷宫: