如何在不更新错误的情况下穿越迷宫

问题描述 投票:0回答:1

我现在正在研究迷宫问题一段时间,我已经调试了我的代码一千次,但找不到我在哪里扭曲它。提示是读取 .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
algorithm
1个回答
0
投票

主要问题是您剥离了输入线。这会删除每行中的所有前导空格,从而破坏了迷宫的一致性。例如,第一个示例如下所示:

#                                                       
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])

我没有在你的代码中寻找其他问题,但我建议你:

  • 使用函数,以及仅在此处使用的局部变量
  • 避免全局变量
  • 避免代码重复。 4 个方向的代码非常相似,您应该只能使用一次,并使用一些变量来确保朝着正确的方向前进。

最终可能会是这样:

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)
© www.soinside.com 2019 - 2024. All rights reserved.