我现在正在研究迷宫问题一段时间,我已经调试了我的代码一千次,但找不到我在哪里扭曲它。提示是读取 .txt 并遍历迷宫,将出现的每个十进制数字添加到总和中,并以“#”结尾结束程序。如果有人可以帮助我找到我的逻辑错误,我将附上我的解决方案和我用作测试的文本文件。我很确定它与我对行和列的更新或矩阵的大小有关。 那是我的 .txt 测试文件:
6 59
#
5
|
\-48-3-----6---------------9-5---------2--3--------7-7-\
|
------------5-------------------0--50---8-------9----4---6/
还有一个更大的
36 80
/-48-3-----6---------------9-5---------2--3--------7-7-\
| |
---|--------5-------------------0--5---8-------9----4---6-|----6---4--68----\
| /0--\ | |
8 0 /-|--------------------4-7-----9------2-6-\ |
\---3---6--4|-|-|----09\ /789--0--#---4-00----71||8------------0--/
| | | | | ||
| 5 | | | |4
/6--11-9--2-----2-------1-7--1----\ 85
5 | 3 | | | | 5|
| | | | 4 | # ||
| | 4 | | | 1|
| | | | 2 | ||
| 3 0 | | 9 ||
| | | | | 8 /2----7-------------8|2--2----0-----3\
| | | 1 | 1 | || |
3 | | | | | | |8 0
\-7--4------91/ | \--|----3-------6----73/| 7
\-----3------634-----90---965-8------------6/ |
| 7 | |
| \---5----8--/ |
| |
\-------------4---9-2-5--1-37-15---2--2--6----9---1-25----/
这是我的解决方案,变量是葡萄牙语,因为我是巴西人:
nome = 'x1.txt'
doc = []
with open(nome, 'r') as file:
for l in file:
linha = list(l.strip())
doc.append(linha)
doc = [[element for element in row if element != '\n'] for row in doc]
linhas = ''
colunas = ''
achou = False
for carac in doc[0]:
if carac == ' ':
achou= True
elif not achou:
linhas += carac
else:
colunas += carac
linhas = int(linhas)
colunas = int(colunas)
# doc.remove(doc[0])
print(linhas, colunas)
print(doc)
somaTotal = 0
num = 0
def esq_dir(linhaA, colunaA):
global num
global somaTotal
num = '0'
c = colunaA
for i in range(c, colunas):
carac = doc[linhaA][i]
print(carac)
print(linhaA, colunaA)
if carac == '#':
somaTotal += int(num)
num = '0'
break
if carac == '-' or carac == '|':
colunaA += 1
somaTotal += int(num)
num = '0'
if carac == '/':
# colunaA += 1
somaTotal += int(num)
linhaA -= 1
subindo(linhaA, colunaA)
break
if carac == '\\':
# colunaA += 1
somaTotal += int(num)
linhaA += 1
descendo(linhaA, colunaA)
break
elif carac.isdigit():
num += carac
colunaA += 1
def dir_esq(linhaA, colunaA):
global somaTotal
global num
num = '0'
c = colunaA
for i in range(c -1,-1, -1):
carac = doc[linhaA][i]
print(carac)
print(linhaA, colunaA)
if carac == '#':
somaTotal += int(num)
num = '0'
break
if carac == '-' or carac == '|':
colunaA -= 1
somaTotal += int(num)
num = '0'
if carac == '\\':
linhaA += 1
somaTotal += int(num)
subindo(linhaA, colunaA)
break
if carac == '/':
linhaA -= 1
somaTotal += int(num)
descendo(linhaA, colunaA)
break
elif carac.isdigit():
num += carac
colunaA -= 1
def descendo(linhaA, colunaA):
global somaTotal
num = '0'
l = linhaA
for i in range(l, linhas):
carac = doc[i][colunaA]
print(carac)
if carac == '#':
somaTotal += int(num)
num = '0'
break
if carac == '-' or carac == '|':
linhaA += 1
somaTotal += int(num)
num = '0'
if carac == '/':
colunaA -= 1
dir_esq(linhaA, colunaA)
break
if carac == '\\':
colunaA += 1
esq_dir(linhaA, colunaA)
break
elif carac.isdigit():
num += carac
linhaA += 1
def subindo(linhaA, colunaA):
global somaTotal
num = '0' # troquei de '' para 0 para evitar syntax errors
l = linhaA
for i in range(l - 1,-1, -1): # alterei para -1 o 'stop' pois não estava lendo a condição de parada (#), portanto não somava o 4
carac = doc[i][colunaA]
print(carac)
print(linhaA, colunaA)
if carac == '#':
somaTotal += int(num)
num = '0'
break
if carac == '-' or carac == '|':
linhaA -=1
somaTotal += int(num)
num = '0'
if carac == '/':
colunaA += 1
somaTotal += int(num)
esq_dir(linhaA, colunaA)
break
if carac == '\\':
linhaA -= 1
somaTotal += int(num)
dir_esq(linhaA, colunaA)
break
elif carac.isdigit():
num += carac
linhaA -= 1
linhaAtual = 0
colunaAtual = 0
for i, linha in enumerate(doc):
if linha and linha[0] == '-':
linhaAtual = i
break
# print(doc)
# print(linhaAtual)
esq_dir(linhaAtual, colunaAtual)
print(somaTotal)type here
主要问题是您剥离了输入线。这会删除每行中的所有前导空格,从而破坏了迷宫的一致性。例如,第一个示例如下所示:
#
5
|
\-48-3-----6---------------9-5---------2--3--------7-7-\
|
------------5-------------------0--50---8-------9----4---6/
...并且
/
和 \
角已断开。
这些语句应该取代您的文件处理部分:
with open(nome, 'r') as file:
doc = [line for line in file.read().splitlines()[1:] if line]
linhas = len(doc)
colunas = len(doc[0])
我没有在你的代码中寻找其他问题,但我建议你:
最终可能会是这样:
def load_maze(nome):
with open(nome, 'r') as file:
return [line for line in file.read().splitlines()[1:] if line]
def find_start(maze):
return next(i for i, line in enumerate(maze) if line[0] == '-')
def walk(maze, row, col, dir):
num = "0"
total = 0
while True:
ch = maze[row][col]
if ch.isdigit():
num += ch
else:
total += int(num)
num = "0"
if ch == "/":
dir ^= 1 # toggle between east-south or west-north
elif ch == "\\":
dir ^= 3 # toggle between east-north or west-south
elif ch == "#":
return total
row += (dir == 1) - (dir == 3) # south:1 north:-1
col += (dir == 0) - (dir == 2) # east: 1 west: -1
maze = load_maze('x1.txt')
row = find_start(maze)
total = walk(maze, row, 0, 0)
print(total)