利用廣度優先遍歷搜索迷宮的python源代碼


廣度優先遍歷簡稱為DFS,是數據結構中比較常用的一個算法,主要原理是采用隊列先進先出的規則,一層一層的訪問圖的節點。而迷宮問題接近與遍歷,但是不同於遍歷,主要考慮是采用棧的形式標記路徑,並對當前節點和死胡同分別標記為2和3,對死胡同的節點彈出棧,這樣循環最終會找到一個路徑。當然,存在一個問題就是不一定是最優的路徑。

'''
Title:廣度優先遍歷探索迷宮
Date: 2018-04-18
Author:Jackie
Commont:
    1、使用棧stack保存路徑
    2、采用廣度優先遍歷,將當前節點(棧的頂點)可用的臨近節點全部壓棧,並標記為2
    3、對於發現死胡同時,將當前節點彈出棧,並標記為3
    4、不需要使用隊列,因為隊列主要實現遍歷,而不是最優化
'''

from collections import deque

matrix = [
    [0, 1, 0, 0, 1],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0],
    [0, 1, 1, 1, 0],
    [0, 0, 0, 1, 0]
]

# dfs function
def dfs_fun(matrix, start, end):
    stack = []
    stack.append(start)
    x, y = start
    matrix[x][y] =2
    forward = True
    while stack:
        pos = stack[-1]
        if pos == end:
            print("Had find last path")
            return stack
        xPos, yPos = pos
        forward = False
        if yPos+1 < len(matrix):
            if matrix[xPos][yPos+1] ==0:
                stack.append((xPos, yPos+1))
                matrix[xPos][yPos+1] =2
                forward = True
        if xPos+1 < len(matrix) :
            if matrix[xPos+1][yPos] ==0:
                stack.append((xPos+1, yPos))
                matrix[xPos+1][yPos] =2
                forward = True
        if xPos-1 >=0 :
            if matrix[xPos-1][yPos] ==0:
                stack.append((xPos-1, yPos))
                matrix[xPos-1][yPos] =2
                forward = True
        if yPos-1>=0:
            if matrix[xPos][yPos-1] ==0:
                stack.append((xPos, yPos-1))
                matrix[xPos][yPos-1] =2
                forward = True
        # bad road
        if not forward:
            x, y = stack.pop()
            matrix[xPos][yPos] = 3
    return False


if __name__ == '__main__':
    result = dfs_fun(matrix, (0,0), (4,4))
    print(result)



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM