编程语言
首页 > 编程语言> > 6.python解答蓝桥杯17年A组真题 迷宫

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矩阵,说明玩家成功走出地图。

黄色玩家不能走出地图

image-20210312162042425

代码

方式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)

image-20210312152402051

方式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