前言
这是一道遇到过的面试题,当时我用队列实现BFS写的,我知道这种走迷宫的题目一般都是选递归形式的DFS,但是我内心喜欢BFS,觉得稳扎稳打的BFS更优雅。今天突发奇想,用栈实现了一下DFS。
代码
# 突发奇想,想用栈写一个走迷宫的dfs
class Solution:
def find_path(self,maze:list,start_point:list,end_point:list):
ans_path = []
if start_point == end_point:
ans_path.append(start_point)
return ans_path
x = []
visited = [[0 for i in range(len(maze))] for j in range(len(maze[0]))]
orders = [[0,-1],[0,1],[1,0],[-1,0]]
x.append(start_point) # 把原始位置记录进去
visited[start_point[0]][start_point[1]] = 1
while len(x)!=0:
# 取栈定节点
father_pot = x[-1]
# 优先按第0个方向走
iorder = 0
cur_order = orders[iorder]
cur_pos = father_pot[0]+cur_order[0],father_pot[1]+cur_order[1]
while cur_pos[0] >= len(maze) or cur_pos[1] >= len(maze[0]) \
or visited[cur_pos[0]][cur_pos[1]]==1 \
or cur_pos[0] < 0 or cur_pos[1] < 0 \
or maze[cur_pos[0]][cur_pos[1]] == -1: # 如果是越界了或者访问过了或者不通
# 越界,换方向
iorder +=1
if iorder >= 4:
# 已经没有方向可走了
# 返回上一级,删除栈顶节点
x.pop()
break
cur_order = orders[iorder]
cur_pos = father_pot[0]+cur_order[0],father_pot[1]+cur_order[1]
# print('here')
if iorder >=4: # 如果是从break跳出来的
continue
# 否则就这个方向可以前进
# 加入到栈顶
x.append(list(cur_pos))
# print(cur_pos)
# input() 调试用
visited[cur_pos[0]][cur_pos[1]] = 1
if list(cur_pos) == end_point:
# 如果找到终点
return x
# 否则从栈顶继续开始探索
return x
if __name__ == '__main__':
s = Solution()
maze = [[0,0,-1],
[-1,0,0],
[0,0,-1]] # 0:路可走,-1:路被封死
ans = s.find_path(maze,[0,0],[2,0])
print(ans) # [(y1,x1),(y2,x2),....]