题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
X 星球的一处迷宫游乐场建在某个小山坡上。它是由 10×10 相互连通的小房间组成的。
房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:
- �L 表示走到左边的房间,
- �R 表示走到右边的房间,
- �U 表示走到上坡方向的房间,
- �D 表示走到下坡方向的房间。
X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把 1100 名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?
如果你还没明白游戏规则,可以参看下面一个简化的 4x4 迷宫的解说图:
思路:
除了一个个数以外
dfs():递归,在每个点,它根据指示牌向上、下、左、右四个方向走。
dfs结束的条件::
1)走出了迷宫,返回1。
2)走不出迷宫,返回0。什么情况下走不出迷宫?兜圈子,回到了曾经走过的点。
用vis[i]j]记录点(i,j)是否曾经走过,如果走过,就是兜圈子。
用不着对每个点都做一次dfs()。
从一个点出发,走过一条路径,最后走出了迷宫,那么以这条路径上所有的点为起点,都能走出迷宫;
若这条路径兜圈子了,那么这条路径上所有的点都不能走出迷宫。
如果对路径进行记录,就能大大减少计算量。
参考代码:
def dfs(x,y):
if x<0 or y<0 or x>=10 or y>=10:
return 1
if vis[x][y]==1: #走过直接返回 0
return 0
vis[x][y]=1
if mp[x][y]=='L':
return dfs(x,y-1)
if mp[x][y]=='R':
return dfs(x,y+1)
if mp[x][y]=='U':
return dfs(x-1,y)
if mp[x][y]=='D':
return dfs(x+1,y)
mp=[[''*10] for i in range(10)] #二维数组存迷宫
for i in range(10): #读迷宫
mp[i]=list(input())
ans=0
for i in range(10):
for j in range(10):
vis=[[0]*10 for _ in range(10)]
if dfs(i,j)==1:
ans+=1
print(ans)
#最终答案 31