题目地址:迷宫2
一道比较简单的DFS模板题,那为什么我们要用DFS而不是使用用BFS呢?在此简单介绍一下DFS与BFS:
DFS:一条路走到底,如果不成功就回溯到上一个点继续走。DFS中存在栈,所以可以运用递归来解决相应问题,DFS会首先把一种可能的情况尝试到底,所以在面对“寻找一个解”或“这个解是否存在?”这种找出xx解,建议优先使用DFS。
BFS:走路的同时如果发现有岔路口会随机进入一个岔路,然后将它的分路情况记录下来,然后再返回来进入另外一个岔路。BFS会一开始尝试所有情况,只要找到符合条件的便会return,所以在面对“最少步数的解”或者“最少交换次数”这种求最短,最少结果方式,建议优先使用BFS。
DFS相应模板(具体情况具体分析,有时需要用到栈):
def DFS(node):
# 相应代码
if 语句: # 用于终止递归
return
# 相应代码
for 循环: # 用于循环递归
# 相应代码
DFS(node)
# 相应代码
此题具体思路为:遍历所有点,DFS判断其是否能够逃出迷宫。
遍历:
for x in range(10):
for y in range(10):
arr = [[0] * 10 for _ in range(10)]
DFS(x, y)
判断条件:
if x < 0 or x > 9 or y < 0 or y > 9: # 逃出迷宫,ans += 1
ans += 1
return 1
if arr[x][y] == 1: # 此点经过,困在迷宫循环,return跳出函数
return 0
上下左右移动:
if maze[x][y] == 'U':
DFS(x - 1, y)
elif maze[x][y] == 'D':
DFS(x + 1, y)
elif maze[x][y] == 'L':
DFS(x, y - 1)
elif maze[x][y] == 'R':
DFS(x, y + 1)
完整代码:
maze = ['UDDLUULRUL',
'UURLLLRRRU',
'RRUURLDLRD',
'RUDDDDUUUU',
'URUDLLRRUU',
'DURLRLDLRL',
'ULLURLLRDU',
'RDLULLRDDD',
'UUDDUDUDLL',
'ULRDLUURRR']
ans = 0
arr = [[0] * 10 for _ in range(10)] # 判断是否经过
def DFS(x, y):
global ans
if x < 0 or x > 9 or y < 0 or y > 9:
ans += 1
return 1
if arr[x][y] == 1:
return 0
arr[x][y] = 1 # 代表此点已经来过
if maze[x][y] == 'U':
DFS(x - 1, y)
elif maze[x][y] == 'D':
DFS(x + 1, y)
elif maze[x][y] == 'L':
DFS(x, y - 1)
elif maze[x][y] == 'R':
DFS(x, y + 1)
return 0
for x in range(10):
for y in range(10):
arr = [[0] * 10 for _ in range(10)]
DFS(x, y)
print(ans)