题目
下图给出了一个迷宫的平面图,其中标记为 11 的为障碍,标记为 00 的为可以通行的地方。
010000
000100
001001
110000
迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它的上、下、左、右四个方向之一。
对于上面的迷宫,从入口开始,可以按
DRRURRDDDR
的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向下、向上、向左、向右走。 对于下面这个更复杂的迷宫(3030 行 5050 列),请找出一种通过迷宫的方式,其使用的步数最少,在步数最少的前提下,请找出字典序最小的一个作为答案。请注意在字典序中 D<L<R<U。
思路
做动态规划脑子做糊涂了,还以为在动态规划呢!去看了一下别人的解析,发现是广度优先遍历(别骂了,算法几乎没学过 呜呜)。然后就自己写了一个bfs,但是用小迷宫进行测试,发现有问题。就是我的输出是把所有元素遍历的顺序给打印了出来,但是这个题目只需要起点到终点的一条路径,但是目前还不知道怎么改。就先放在这!
另附上别人的代码,供学习
代码
我的代码,对给出的小矩阵进行测试,输出为:
DDRRRURRDRDRDLLRL
python">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)
输出正确的代码!
python">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进制的数,然后再投影成字母的形式。
代码
python">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)