Python breadth-first search matrix print path

前端 未结 3 1859
深忆病人
深忆病人 2021-01-23 23:16

I have this line of code that tests wether or not there is a path to be found in a labyrinth represented by a matrix. How do I print the path at the end after I\'ve determined w

3条回答
  •  感情败类
    2021-01-24 00:10

    Here's a fairly simple way to find the path, by tracing it backwards from the exit. You can reverse this by saving the moves to a stack.

    To make it easier to see, I've changed your code slightly to put N, S, E, W in the matrix (for North, South, East, West). To decode those direction letters to (row, column) steps I use a dictionary.

    from queue import Queue
    
    maze='''\
    0 0 0 0 1 0 0 0
    0 1 1 0 1 0 1 0
    0 1 0 0 1 0 1 0
    0 0 0 1 0 0 1 0
    0 1 0 1 0 1 1 0
    0 0 1 1 0 1 0 0
    1 0 0 0 0 1 1 0
    0 0 1 1 1 1 0 0
    '''
    
    def show(matrix):
        for line in matrix:
            print(*line)
        print()
    
    matrix=maze.splitlines()
    matrix=[i.strip() for i in matrix]
    matrix=[i.split() for i in matrix]
    numrows, numcols = len(matrix), len(matrix[0])
    
    show(matrix)
    
    q=Queue()
    row=0
    col=0
    q.put((row,col))
    while not q.empty():
        row, col = q.get()
        if col+1 < numcols and matrix[row][col+1] == "0":
             q.put((row, col+1))
             matrix[row][col+1] = "W"
        if row+1 < numrows and matrix[row+1][col] == "0":
             q.put((row+1, col))
             matrix[row+1][col] = "N"
        if 0 <= col-1 and matrix[row][col-1] == "0":
             q.put((row, col-1))
             matrix[row][col-1] = "E"
        if 0 <= row-1 and matrix[row-1][col] == "0":
             q.put((row-1, col))
             matrix[row-1][col] = "S" 
    row,col=numrows-1,numcols-1
    var=matrix[row][col]
    
    show(matrix)
    
    if var=="0":
        print ("There is no path.")
        exit()
    else:
        print ("There is a path.")
    
    # Trace the path
    step = {'N': (-1, 0), 'S': (1, 0), 'E': (0, 1), 'W': (0, -1)}
    while True:
        print((row, col), 'go', var)
        if row == 0 and col == 0:
            break
        r, c = step[var]
        row += r
        col += c
        var = matrix[row][col]
    
    print('Home!')
    

    output

    0 0 0 0 1 0 0 0
    0 1 1 0 1 0 1 0
    0 1 0 0 1 0 1 0
    0 0 0 1 0 0 1 0
    0 1 0 1 0 1 1 0
    0 0 1 1 0 1 0 0
    1 0 0 0 0 1 1 0
    0 0 1 1 1 1 0 0
    
    E W W W 1 S W W
    N 1 1 N 1 S 1 N
    N 1 E N 1 S 1 N
    N W W 1 S W 1 N
    N 1 N 1 S 1 1 N
    N W 1 1 S 1 E N
    1 N W W W 1 1 N
    E N 1 1 1 1 E N
    
    There is a path.
    (7, 7) go N
    (6, 7) go N
    (5, 7) go N
    (4, 7) go N
    (3, 7) go N
    (2, 7) go N
    (1, 7) go N
    (0, 7) go W
    (0, 6) go W
    (0, 5) go S
    (1, 5) go S
    (2, 5) go S
    (3, 5) go W
    (3, 4) go S
    (4, 4) go S
    (5, 4) go S
    (6, 4) go W
    (6, 3) go W
    (6, 2) go W
    (6, 1) go N
    (5, 1) go W
    (5, 0) go N
    (4, 0) go N
    (3, 0) go N
    (2, 0) go N
    (1, 0) go N
    (0, 0) go E
    Home!
    

提交回复
热议问题