迷宫 && 年号字串

文章讨论了一种通过广度优先遍历(BFS)解决大型迷宫问题的方法,而不是使用动态规划。作者分享了自己的BFS实现代码,但遇到了输出整个路径而非起点到终点路径的问题。文章提供了正确的BFS代码示例,用于找到迷宫中最短且字典序最小的路径。
摘要由CSDN通过智能技术生成

题目

下图给出了一个迷宫的平面图,其中标记为 11 的为障碍,标记为 00 的为可以通行的地方。

010000

000100

001001

110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。

对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(3030 行 5050 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。

请注意在字典序中 D<L<R<U。

思路

做动态规划脑子做糊涂了,还以为在动态规划呢!去看了一下别人的解析,发现是广度优先遍历(别骂了,算法几乎没学过 呜呜)。然后就自己写了一个bfs,但是用小迷宫进行测试,发现有问题。就是我的输出是把所有元素遍历的顺序给打印了出来,但是这个题目只需要起点到终点的一条路径,但是目前还不知道怎么改。就先放在这!

另附上别人的代码,供学习

代码

我的代码,对给出的小矩阵进行测试,输出为:

DDRRRURRDRDRDLLRL

import os
import sys

# 请在此输入您的代码

'''data = ['01010101001011001001010110010110100100001000101010',
'00001000100000101010010000100000001001100110100101',
'01111011010010001000001101001011100011000000010000',
'01000000001010100011010000101000001010101011001011',
'00011111000000101000010010100010100000101100000000',
'11001000110101000010101100011010011010101011110111',
'00011011010101001001001010000001000101001110000000',
'10100000101000100110101010111110011000010000111010',
'00111000001010100001100010000001000101001100001001',
'11000110100001110010001001010101010101010001101000',
'00010000100100000101001010101110100010101010000101',
'11100100101001001000010000010101010100100100010100',
'00000010000000101011001111010001100000101010100011',
'10101010011100001000011000010110011110110100001000',
'10101010100001101010100101000010100000111011101001',
'10000000101100010000101100101101001011100000000100',
'10101001000000010100100001000100000100011110101001',
'00101001010101101001010100011010101101110000110101',
'11001010000100001100000010100101000001000111000010',
'00001000110000110101101000000100101001001000011101',
'10100101000101000000001110110010110101101010100001',
'00101000010000110101010000100010001001000100010101',
'10100001000110010001000010101001010101011111010010',
'00000100101000000110010100101001000001000000000010',
'11010000001001110111001001000011101001011011101000',
'00000110100010001000100000001000011101000000110011',
'10101000101000100010001111100010101001010000001000',
'10000010100101001010110000000100101010001011101000',
'00111100001000010000000110111000000001000000001011',
'10000001100111010111010001000110111010101101111000']'''

data = ['010000',
'000100',
'001001',
'110000']

offset = [[1, 0], [0, -1], [0, 1], [-1, 0]]

road = [[0, 0]]
point = [[ 0 for i in range(6)] for j in range(4)]
result = ''
x = 0
y = 0
point[0][0] = 1
while x != 3 or y != 5:
  count = 0
  for i in offset:
    count += 1
    if x + i[0] >= 0 and x + i[0] < 4 and y + i[1] >= 0 and y + i[1] < 6:
      if point[x + i[0]][y + i[1]] == 0 and data[x + i[0]][y + i[1]] == '0':
        road.append([x + i[0], y + i[1]])
        point[x + i[0]][y + i[1]] = 1
        if count == 1:
          result += 'D'
        if count == 2:
          result += 'L'
        if count == 3:
          result += 'R'
        if count == 4:
          result += 'U'
  x, y = road.pop(0)

print(result)


 输出正确的代码!

import os
import sys

# 请在此输入您的代码

data = ['01010101001011001001010110010110100100001000101010',
'00001000100000101010010000100000001001100110100101',
'01111011010010001000001101001011100011000000010000',
'01000000001010100011010000101000001010101011001011',
'00011111000000101000010010100010100000101100000000',
'11001000110101000010101100011010011010101011110111',
'00011011010101001001001010000001000101001110000000',
'10100000101000100110101010111110011000010000111010',
'00111000001010100001100010000001000101001100001001',
'11000110100001110010001001010101010101010001101000',
'00010000100100000101001010101110100010101010000101',
'11100100101001001000010000010101010100100100010100',
'00000010000000101011001111010001100000101010100011',
'10101010011100001000011000010110011110110100001000',
'10101010100001101010100101000010100000111011101001',
'10000000101100010000101100101101001011100000000100',
'10101001000000010100100001000100000100011110101001',
'00101001010101101001010100011010101101110000110101',
'11001010000100001100000010100101000001000111000010',
'00001000110000110101101000000100101001001000011101',
'10100101000101000000001110110010110101101010100001',
'00101000010000110101010000100010001001000100010101',
'10100001000110010001000010101001010101011111010010',
'00000100101000000110010100101001000001000000000010',
'11010000001001110111001001000011101001011011101000',
'00000110100010001000100000001000011101000000110011',
'10101000101000100010001111100010101001010000001000',
'10000010100101001010110000000100101010001011101000',
'00111100001000010000000110111000000001000000001011',
'10000001100111010111010001000110111010101101111000']


point = [[ 0 for i in range(50)] for j in range(30)]

def is_node(x, y):
  if x  >= 0 and x  < 30 and y  >= 0 and y  < 50 and point[x][y] == 0 and data[x][y] == '0':
    return True
  else:
    return False

def BFS(x, y):
  road = [(0, 0, '')]
  while road :
    x, y, z = road.pop(0)
    if is_node(x, y):
      point[x][y] = 1
      road.append((x+1, y, z+'D'))
      road.append((x, y-1, z+'L'))
      road.append((x, y+1, z+'R'))
      road.append((x-1, y, z+'U'))
    if x == 29 and y == 49:
      return z

print(BFS(0, 0))

题目

小明用字母 A 对应数字 1,B 对应 2,以此类推,用 Z 对应 26。对于 27 以上的数字,小明用两位或更长位的字符串来对应,例如 AA 对应 27,AB 对应 28,AZ 对应 52,LQ 对应 329。

请问 2019 对应的字符串是什么?

思路

最开始没看出来,后面才发现实际是10进制转化为26进制的数,26进制的数表示为字母。

先把10进制数转化为26进制的数,然后再投影成字母的形式。 

代码 

import os
import sys

# 请在此输入您的代码

a = 2019 
l = '*ABCDEFGHIJKLMNOPQRSTUVWXYZ' # 为了与字母表对应 前面加个* 使下标与字母表示的数字对应
flag = True
result = []
while flag: # 使用短除法进行转化
  b = a // 26
  result.append(a % 26)  
  a = b
  if a == 0:  # 除数为0时,结束短除法
    flag = False

out = ''
for i in result[::-1]:  # [::-1]表示翻转列表 这里是因为最先加入的数字是位数小的 输出需要翻转一下
  out += l[i]
print(out)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值