蓝桥杯每日积累——走迷宫+门牌制作+卡片

【走迷宫】
走迷宫这题是我今晚最有收获的一题,这题在数据结果和算法方面不难。应用的是二维数组和递归算法。但是我们在写这道题的时候最容易出现数组越界的错误。而且我经过反复检查逻辑问题均无错误,那为啥还会报错?接下来请听我细谈:
【解题思路】
走迷宫这道题无非是根据地图路径走,我们只需要判断两点,分别是:是否走出迷宫?是否在绕圈子?
是否走出迷宫? 这一点很容易判断,只需要判断该次位置下标是否超出地图边界即可
是否在绕圈子? 也很容易知道,只需要记录每一次路径并且判断现在走到的位置以前是否走过就知道了,走过就是在绕圈子,没走过就继续走吧。结果只有两种!走出或者绕圈子!简单吧

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

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

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

L 表示走到左边的房间,
R 表示走到右边的房间,
U 表示走到上坡方向的房间,
D 表示走到下坡方向的房间。
X 星球的居民有点懒,不愿意费力思考。他们更喜欢玩运气类的游戏。这个游戏也是如此!

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

迷宫地图如下:

UDDLUULRUL
UURLLLRRRU
RRUURLDLRD
RUDDDDUUUU
URUDLLRRUU
DURLRLDLRL
ULLURLLRDU
RDLULLRDDD
UUDDUDUDLL
ULRDLUURRR
请你计算一下,最后,有多少玩家会走出迷宫,而不是在里边兜圈子?

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

图片描述

运行限制
最大运行时间:1s
最大运行内存: 128M

好,我先给出我的解题代码:

#记录地图
maze=[
"UDDLUULRUL",
"UURLLLRRRU",
"RRUURLDLRD",
"RUDDDDUUUU",
"URUDLLRRUU",
"DURLRLDLRL",
"ULLURLLRDU",
"RDLULLRDDD",
"UUDDUDUDLL",
"ULRDLUURRR"
]

#记录行走路径
path=[
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,0,0],
]

#清空每一次的行走路径
def path_clean():
    for i in range(len(path)):
        path[i]=[0,0,0,0,0,0,0,0,0,0]

#根据方向行走,记录行走路径,寻机判断是否绕圈子或者走出迷宫
def walk_bydirection(index_row, index_col):
    walknext_flag=1
    if index_row<0 or index_row>9 or index_col<0 or index_col>9:#已经走出迷宫
        # print("已经走出迷宫")
        return 1
    elif path[index_row][index_col]==1:#此路之前已经走过,判断为绕圈子
        # print("这是在绕圈子")
        walknext_flag=0
        return 0

    else:#没有绕圈子也没有走出则继续走
        path[index_row][index_col]=1#标记现在这个地方已经走过
        if maze[index_row][index_col]=="R":
            index_col+=1
        elif maze[index_row][index_col]=="L":
            index_col-=1
        elif maze[index_row][index_col]=="U":
            index_row-=1
        elif maze[index_row][index_col] == "D":
            index_row+=1
    if walknext_flag==1:#随它去,继续走下一步吧
        return walk_bydirection(index_row, index_col)

result_count=0#结果变量,统计最终走出迷宫的人数
for i in range(10):
    for j in range(10):
        path_clean()#每个人走之前记得要清空行走路径啊,毕竟每个人都是重新走的
        result_count+=walk_bydirection(i,j)
print(result_count)

这个代码思路相信大家都想得出来,可是细节很重要啊!我之前是先判断是否走过再判断是否走出,结果便会出现数组越界错误!接下来请你详细看看我用于判断的两个if语句
【判断是否走过】

    elif path[index_row][index_col]==1:#此路之前已经走过,判断为绕圈子
        # print("这是在绕圈子")
        walknext_flag=0
        return 0

【判断是否走出】

if index_row<0 or index_row>9 or index_col<0 or index_col>9:#已经走出迷宫
        # print("已经走出迷宫")
        return 1

想一想,相信聪明的你已经想到了,判断是否走过是通过path数组值来查找的。但是如果此时的位置已经出去了呢?我还把该下标带入判断则必定越界不是嘛!所以,解决问题的办法便是把这两个判断交换位置,如果该位置已经出界,便退出递归便是!
总结:越界这个问题是很搞人心态的,相信很多程序员都有这样的困扰:我的逻辑无误为啥数组越界?所以我建议大家遇到涉及越界这样的问题总得先判断越界条件,再处理其他判断。我这次也算阴沟里翻船了,老了,哈哈哈
【门牌制作】
先看一看题目吧,这题很简单,练一练手就是

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝要为一条街的住户制作门牌号。

这条街一共有 20202020 位住户,门牌号从 1 到 20202020 编号。

小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。

请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

运行限制
最大运行时间:1s
最大运行内存: 128M

【解题思路】
这道题没用到啥算法,用数组存就是,当然python里的字符串就当数组用没啥毛病。先将1到2020存到字符串中再遍历检索有多少个字符”2“就可。智障得一批,就当练手熟悉语法哈
【我的解题代码如下】

str1=""
count=0
for i in range(2021):
    strtemp=str(i)
    str1+=strtemp
for i in range(1,len(str1)):
    if "2"==str1[i]:
        count+=1
print(count)

【总结】
练个手

【卡片】
卡片这道题比门牌制作难一点,相对来讲,门牌告诉了我们有多少门牌号码统计字符出现个数,但是卡片这道题是给出了卡片问我们能拼出1到多少数字。既然这样,**便一个一个拼数字!**怕啥,先暴力也没错啊。

请看题:
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题

运行限制
最大运行时间:1s
最大运行内存: 128M

先给出我的解题代码

number_list="0123456789" #记录数字类型的字符串,当数组用
number_count=[0,0,0,0,0,0,0,0,0,0] #和字符串位置匹配的数值数组,统计对应数字出现次数
exitflag=0 #定义一个判断是否退出的标志,为1则不再拼数字
for i in range(1,20211):#接下来便从1开始一个一个拼数字吧!
    str_temp=str(i)#将该数字转化成字符串
    for s in str_temp:#检索该数字中的每一个数
         #数值数组中对应数字下标的数值加1
        number_count[number_list.index(s)]+=1
    for j in number_count: #在数值数组中如果某一个数字出现的次数达到了2021次,则退出标志置为1,并且退出该循环
        if j>=2021: 
            print(str_temp) #打印出该最大拼出来的数,便是答案
            exitflag=1
    if exitflag==1:
        break

【总结】
卡片这道题我还是涉嫌用了暴力法来拼数字,因为也不知道数字上线嘛,便直接将数字张数设置为了循环次数,当然,如果卡片用完了便会退出循环便是。我的时间复杂度准确说O(9n),但是用了双重for循环嘛,总是不完美的。同学们有更好的编程思路请您在留言区教教我啊。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吴澳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值