• 迷宫-蓝桥云课,python实现


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

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

    • LL 表示走到左边的房间,
    • RR 表示走到右边的房间,
    • UU 表示走到上坡方向的房间,
    • DD 表示走到下坡方向的房间。

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

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

    迷宫地图如下:

    UDDLUULRUL
    UURLLLRRRU
    RRUURLDLRD
    RUDDDDUUUU
    URUDLLRRUU
    DURLRLDLRL
    ULLURLLRDU
    RDLULLRDDD
    UUDDUDUDLL
    ULRDLUURRR

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

    主要思路:

    先用一个字符串str1保存,迷宫分布

    1.先把边缘能走出迷宫的位置找出来,

            即上边缘向上走的位置

            即下边缘向下走的位置

            即左边缘向左走的位置

            即右边缘向右走的位置

    这里是用flag列表统计,找到了下标为

    flag = [0, 4, 5, 8, 93, 99]即为能走出的位置

    2.再以此假定从0~100位置每个人开始走,

            当然如果某人起始下标和标记的flag列表中某下标一样,则可以走出去。

            当起始下标不一样,就开始行走,行走策略是(因为这里是字符串表示,且刚好100人对应100个位置(0~99下标)),故有以下规律:

            if str1[k] == 'U':
                k -= 10
            elif str1[k] == 'D':
                k += 10
            elif str1[k] == 'L':
                k -= 1
            else:#R
                k += 1

            行走后再判断一下,是否有人走过的位置与flag标志列表中的一致,有就直接算一位

            其中为了避免死循环,人一直走的情况,加一个cur列表,记录该人走过的位置下标,如果入列表路径中有与之前相重合的,则一定会死循环,这种情况说明不用找了。

    1. str1 ="\
    2. UDDLUULRUL\
    3. UURLLLRRRU\
    4. RRUURLDLRD\
    5. RUDDDDUUUU\
    6. URUDLLRRUU\
    7. DURLRLDLRL\
    8. ULLURLLRDU\
    9. RDLULLRDDD\
    10. UUDDUDUDLL\
    11. ULRDLUURRR"
    12. #标志能走出去的位置
    13. flag = []
    14. for i in range(10):#i表示行,第几行
    15. for j in range(10):#j表示列,第几列
    16. #处理边界上一定能走通的位置,标记一下,即只要有人走到了这个标记处就能出迷宫
    17. if i == 0 and str1[i*10+j] == 'U':
    18. flag.append(i*10+j)
    19. if i == 9 and str1[i*10+j] == 'D':
    20. flag.append(i*10+j)
    21. if j == 0 and str1[i*10+j] == 'L':
    22. flag.append(i*10+j)
    23. if j == 9 and str1[i*10+j] == 'R':
    24. flag.append(i*10+j)
    25. # UDDLUULRUL\
    26. # UURLLLRRRU\
    27. # RRUURLDLRD\
    28. # RUDDDDUUUU\
    29. # URUDLLRRUU\
    30. # DURLRLDLRL\
    31. # ULLURLLRDU\
    32. # RDLULLRDDD\
    33. # UUDDUDUDLL\
    34. # ULRDLUURRR"
    35. #处理这100个人
    36. count = 0#记录走出的人数
    37. for i in range(0,100):
    38. k = i
    39. if k in flag:
    40. count += 1
    41. continue
    42. cur = []#记录这个人走的路径如第一个人下标为0直接上走,cur=[0],第8个人下标为7,先右走再上走,cur=[7,8]
    43. cur.append(k)#记录起始位置
    44. while True: #第一位是原k不用考虑
    45. if str1[k] == 'U':
    46. k -= 10
    47. elif str1[k] == 'D':
    48. k += 10
    49. elif str1[k] == 'L':
    50. k -= 1
    51. else:#R
    52. k += 1
    53. if k in flag:#找到了标志的正确位置,能出去
    54. count += 1
    55. break
    56. if k in cur:#说明有循环了,走不出去,不用走了
    57. break
    58. cur.append(k)
    59. print(count)

    蓝桥云课结果:

  • 相关阅读:
    Windows下QT实现托盘程序及系统托盘刷新
    怎样在CSDN插入代码块 怎么变色?
    构建超大规模的行人检测数据集
    Http不转换成Https会有什么后果?
    IP地址和MAC地址
    56. 合并区间
    【LeetCode动态规划#13】买卖股票含冷冻期(状态众多,比较繁琐)、含手续费
    机器学习笔记 - 简单了解模式识别
    java-继承类练习
    java与es8实战之一:以builder pattern开篇
  • 原文地址:https://blog.csdn.net/qq_47991812/article/details/128101440