6.python解答蓝桥杯17年A组真题 迷宫
作者:互联网
6.python解答蓝桥杯17年A组真题 迷宫
标题:迷宫(填空题)
X星球的一处迷宫游乐场建在某个小山坡上。
它是由10x10相互连通的小房间组成的。
房间的地板上写着一个很大的字母。
我们假设玩家是面朝上坡的方向站立,则:
L表示走到左边的房间,
R表示走到右边的房间,
U表示走到上坡方向的房间,
D表示走到下坡方向的房间。
X星球的居民有点懒,不愿意费力思考。
他们更喜欢玩运气类的游戏。这个游戏也是如此!
开始的时候,直升机把100名玩家放入一个个小房间内。
玩家一定要按照地上的字母移动。
迷宫地图如下:
UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫?
而不是在里边兜圈子。
请提交该整数,表示走出迷宫的玩家数目,不要填写任何多余的内容。
答案:31
思路
每一个玩家(100个)都循环走一遍地图,用
tabdict
字典(用列表也可以)做标记经过点的次数,如果当前点次数大于1,说明该玩家在地图陷入死循环,结束该玩家游戏,当玩家坐标超出10*10矩阵,说明玩家成功走出地图。
黄色玩家不能走出地图
代码
方式1,传统暴力法
# 迷宫
# 方式1,暴力法
map = ['UDDLUULRUL',
'UURLLLRRRU',
'RRUURLDLRD',
'RUDDDDUUUU',
'URUDLLRRUU',
'DURLRLDLRL',
'ULLURLLRDU',
'RDLULLRDDD',
'UUDDUDUDLL',
'ULRDLUURRR',]
count = 0
tabdict = {} # 标记字典,标记所在坐标进过次数
for i in list(range(10)):
for j in list(range(10)):
# 每个玩家开始之前把标记字典重置为0
for key in tabdict:
tabdict[key] = 0
x = i
y = j
# 将玩家起点坐标的对应字典标为1
label = str(x)+str(y)
if label in tabdict:
tabdict[label] += 1
else:
tabdict[label] = 1
# 开始游戏
while True:
if map[x][y] == 'U':
x -= 1
elif map[x][y] == 'D':
x += 1
elif map[x][y] == 'L':
y -= 1;
elif map[x][y] == 'R':
y += 1
# 判断是否走出来了
if x<0 or x>9 or y<0 or y>9:
count += 1
break
label = str(x)+str(y)
if label in tabdict:
tabdict[label] += 1
else:
tabdict[label] = 1
# 判断是否重复走了该坐标
if tabdict[label] > 1:
break
print(count)
方式2.深度dfs递归
# 迷宫
# 方式2 深度递归
map = ['UDDLUULRUL',
'UURLLLRRRU',
'RRUURLDLRD',
'RUDDDDUUUU',
'URUDLLRRUU',
'DURLRLDLRL',
'ULLURLLRDU',
'RDLULLRDDD',
'UUDDUDUDLL',
'ULRDLUURRR', ]
count = 0
q = 1
tablist = [[0] * 10 for i in range(10)] # 标记列表,标记所在坐标进过次数
def game(x, y):
# 判断玩家当前坐标是否成功走出地图
if x < 0 or x > 9 or y < 0 or y > 9:
global count # 要表明全局变量才可以修改 count值
count += 1
return True
# 判断是否当前坐标是否重复
if tablist[x][y] == 1:
return False
# 将玩家坐标的对应字典标为1
tablist[x][y] = 1
# 正常情况走地图
if map[x][y] == 'U':
# 递归
game(x - 1, y)
elif map[x][y] == 'D':
game(x + 1, y)
elif map[x][y] == 'L':
game(x, y - 1)
elif map[x][y] == 'R':
game(x, y + 1)
else:
return False
for i in list(range(10)):
for j in list(range(10)):
# 每个玩家开始之前把标记字典重置为0
tablist = [[0] * 10 for i in range(10)] # 懒得置零了,重建一个数组好了
x = i
y = j
# 开始游戏 和我看的C语言代码不同,递归中game返回的是None,不是True或 False
result = game(x, y)
# print(result)
print(count)
.
.
.
标签:count,10,组真题,17,map,玩家,蓝桥,tabdict,label 来源: https://blog.csdn.net/qq_38463737/article/details/114699413