# BFS搜索,同时返回路径
#=================================================================================
r = 5
c = 5
maze = [[0, 1, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]]
#print(' '.join(map(str,t)))
xy0 = [0,0,-1]
xy1 = [r-1,c-1,-1]
MOV = [[1,0],[0,1],[-1,0],[0,-1]] # 四个方向移动一格
#---------------------------------------------------------------------------------
# Path中的每一行存有路径坐标点,第三个值保存上一个节点的list索引,从0开始
def road(visited):
shortest_path = []
shortest_path.append(visited[-1][:-1])
t = visited[-1][-1]
while t!=-1:
shortest_path.append(visited[t][:-1])
t = visited[t][-1]
return shortest_path[::-1]
#---------------------------------------------------------------------------------
# BFS(宽度优先搜索)解迷宫问题
def bfs(xy0):
queue = [xy0] # 开始点进入队列
visited = [] # 记录所有访问过的点,以及每一个点前一个节点索引
k = 0
while queue: # 队列不为空即运行
xy = queue.pop() # 队列中取出一个新坐标点
maze[xy[0]][xy[1]] = 9 # 开始点标记为已访问值9
visited.insert(k, xy) # 相当于path.append(xy),这样写更清楚
if xy[0] == xy1[0] and xy[1] == xy1[1]:
shortest_path = road(visited) # 到达终点时,反向寻找来时路径
return shortest_path
for mov in MOV: # 四个方向移动
xy_new = [xy[0]+mov[0], xy[1]+mov[1]] # 移动后的新坐标
if 0<=xy_new[0]<=r-1 and 0<=xy_new[1]<=c-1 and maze[xy_new[0]][xy_new[1]] == 0: # 坐标有效且没有被访问过
xy_new = [xy_new[0],xy_new[1],k] # 将前一个点的索引加入坐标之后(用于反向寻找路径)
queue.insert(0, xy_new) # 新坐标不为终点,新坐标入队列,
k += 1
#---------------------------------------------------------------------------------
shortest_path = bfs(xy0)
if shortest_path:
for i in shortest_path:
print('('+str(i[0])+','+str(i[1])+')')
else:
print('none')
#---------------------------------------------------------------------------------
# DFS搜索,返回路径
#=================================================================================
r = 5
c = 5
maze = [[0, 1, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]]
#print(' '.join(map(str,t)))
xy0 = [0,0]
xy1 = [r-1,c-1]
MOV = [[1,0],[0,1],[-1,0],[0,-1]] # 四个方向移动一格
#---------------------------------------------------------------------------------
# 递归调用dfs(xy_new, res+[xy_new])时, res+[xy_new]实际保存了不断增长的路径
res = [xy0]
def dfs(xy0, res): # xy0为当前搜索点,res保存了当前点历史路径
maze[xy0[0]][xy0[1]] = 9
if xy0[0] == xy1[0] and xy0[1] == xy1[1]:
shortest_path = res
return shortest_path # 到达终点时读取res返回最路径
for mov in MOV: # 四个方向移动
xy_new = [xy0[0]+mov[0], xy0[1]+mov[1]] # 移动后的新坐标
if 0<=xy_new[0]<=r-1 and 0<=xy_new[1]<=c-1 and maze[xy_new[0]][xy_new[1]] == 0: # 坐标有效且没有被访问过
shortest_path = dfs(xy_new, res+[xy_new]) # 调用下一个节点,第二个参数传递路径
if shortest_path: # 只有dfs返回不为空时,才能返回,空时不能返回,程序会提前结束
return shortest_path
#---------------------------------------------------------------------------------
shortest_path = dfs(xy0, res)
if shortest_path:
for i in shortest_path:
print('('+str(i[0])+','+str(i[1])+')')
else:
print('none')
#---------------------------------------------------------------------------------