蓝桥杯刷题-迷宫

蓝桥杯-迷宫

DAY ONE

写在前面的话:这次报名的是python组,python的语法有些遗忘,通过做题把python的语法捡一捡,同时把这学期学得数据结构运用到实际中做题中

题目如下

X 星球的一处迷宫游乐场建在某个小山坡上。它是由 10 ×10 相互连通的小房间组成的。

房间的地板上写着一个很大的字母。我们假设玩家是面朝上坡的方向站立,则:

  • L 表示走到左边的房间,
  • R 表示走到右边的房间,
  • U 表示走到上坡方向的房间,
  • D 表示走到下坡方向的房间。

X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!

开始的时候,直升机把 100名玩家放入一个个小房间内。玩家一定要按照地上的字母移动。

迷宫地图如下:

UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR

请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?

如果你还没明白游戏规则,可以参看下面一个简化的 4x4 迷宫的解说图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xVcgNvFT-1642228673166)(images/蓝桥杯-迷宫/uid1580206-20210317-1615963493412.png)]

分析

1、填空题,没有什么运行时间和运行内存的限制

2、可以采取暴力遍历法,把从每个点出发的路径遍历一遍,设置一个count,满足条件就加一

3、深度遍历,递归调用

具体实现

遇到的问题

1、如何初始化地图

列表字符串的形式

L = ['' for i in range(10)]#列表推导式
#L = [''] * 10 同样能达到相同的效果
L[0] = "UDDLUULRUL"
L[1] = "UURLLLRRRU"
L[2] = "RRUURLDLRD"
L[3] = "RUDDDDUUUU"
L[4] = "URUDLLRRUU"
L[5] = "DURLRLDLRL"
L[6] = "ULLURLLRDU"
L[7] = "RDLULLRDDD"
L[8] = "UUDDUDUDLL"
L[9] = "ULRDLUURRR"

2、遍历过程的主要部分(递归实现)

def dfs(x, y):
    global count  #这里因为在函数外定义了count,在global
    if (visited[x][y] == 1):#设置的二维数组,一旦访问,将值置为一,判断条件成立,说明回到已经访问的点,结束递归
        return
    if (x < 0 or y < 0 or x >= 10 or y >= 10):
        count += 1
        return
    #满足条件,计数加一,递归结束
    
    
    #python里没有switch语句,用if语句代替
    #移动过程中,递归的参数x,y很容易弄混,注意区分
    #visited二维数组要比地图大一个格子,否则第一个if语句会报错
    if (L[x][y] == "L"):
        visited[x][y] = 1
        dfs(x, y - 1)
        visited[x][y] = 0
    elif (L[x][y] == "R"):
        visited[x][y] = 1
        dfs(x, y + 1)
        visited[x][y] = 0
    elif (L[x][y] == "U"):
        visited[x][y] = 1
        dfs(x - 1, y )
        visited[x][y] = 0
    else:
        visited[x][y] = 1
        dfs(x + 1, y)
        visited[x][y] = 0

附完整代码:

L = ['' for i in range(10)]
L[0] = "UDDLUULRUL"
L[1] = "UURLLLRRRU"
L[2] = "RRUURLDLRD"
L[3] = "RUDDDDUUUU"
L[4] = "URUDLLRRUU"
L[5] = "DURLRLDLRL"
L[6] = "ULLURLLRDU"
L[7] = "RDLULLRDDD"
L[8] = "UUDDUDUDLL"
L[9] = "ULRDLUURRR"
for i in range(10):
    for j in range(10):
        print(L[i][j],end='')
    print()
# print (L)
visited = [[0 for i in range(11)] for i in range(11)]
for i in range(11):
    for j in range(11):
        print(visited[i][j],end='')
    print()
print(L[2][4])
count = 0
def dfs(x, y):
    global count
    if (visited[x][y] == 1):
        return
    if (x < 0 or y < 0 or x >= 10 or y >= 10):
        count += 1
        return
    if (L[x][y] == "L"):
        visited[x][y] = 1
        dfs(x, y - 1)
        visited[x][y] = 0
    elif (L[x][y] == "R"):
        visited[x][y] = 1
        dfs(x, y + 1)
        visited[x][y] = 0
    elif (L[x][y] == "U"):
        visited[x][y] = 1
        dfs(x - 1, y )
        visited[x][y] = 0
    else:
        visited[x][y] = 1
        dfs(x + 1, y)
        visited[x][y] = 0


def test():
    for i in range(10):
        for j in range(10):
            dfs(i, j)


if __name__ == "__main__":
    test()
    print(count)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值