小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

用棧實現(xiàn)廣度優(yōu)先搜索(BFS)解決迷宮問題

 算法與編程之美 2023-07-11 發(fā)布于四川

1 問題

迷宮問題是一種常見的計算機科學(xué)問題,通常需要在二維網(wǎng)格上找到從起點到終點的路徑,同時避開所有障礙物。這種問題經(jīng)常涉及到計算機圖形學(xué)、人工智能和路徑規(guī)劃等領(lǐng)域。如何尋找從起點到終點的路徑并避開所有障礙物是一個經(jīng)典的問題,那么該使用什么方法解決此類問題呢?

2 方法

廣度優(yōu)先搜索算法(BFS)是解決迷宮問題的一種有效方法。BFS算法初始化一個隊列和一個集合,隊列用于存儲待搜索單元,集合用于存儲已搜過的節(jié)點?;舅悸肥菑钠瘘c開始進行遍歷,并將與其相鄰的、未被訪問過的單元格加入到隊列中,以便下一次遍歷。由于BFS算法會優(yōu)先訪問距離起點近的單元格,因此該算法可以保證找到最短路徑。

  1. 定義節(jié)點類,包含單元的坐標和節(jié)點的父節(jié)點
  2. 判斷單元格是否為障礙物,并將起點和終點添加到棧中
  3. 初始化一個棧和一個集合,將起點加入棧中并將其標記為已訪問
  4. 當棧非空時,彈出棧頂元素,并檢查是否到達終點。如果是,則返回路徑;否則,遍歷當前節(jié)點的相鄰未訪問節(jié)點,將其加入棧中并標記為已訪問
  5. 如果找不到路徑,返回None

通過實驗、實踐等證明提出的方法是有效的,是能夠解決開頭提出的問題。

代碼清單 1

# 定義一個節(jié)點類,該節(jié)點包含了單元的坐標和節(jié)點的父節(jié)點,用于記錄路徑。
class Node:
def __init__(self, row, col, parent=None):
self.row = row
self.col = col
self.parent = parent
# 實現(xiàn)一個函數(shù),用于判斷單元格是否為障礙物,以及將起點和終點添加到棧中。
def is_valid(maze, row, col):
if row < 0 or row >= len(maze) or col < 0 or col >= len(maze[0]) or maze[row][col] == 1:
return False
return True
def solve_maze(maze, start, end):
stack = [Node(start[0], start[1])] # 將起點加入棧中
visited = [[False for _ in range(len(maze[0]))] for _ in range(len(maze))]
visited[start[0]][start[1]] = True
while stack:
cur_node = stack.pop() # 彈出棧頂元素
if cur_node.row == end[0] and cur_node.col == end[1]: # 如果到達終點,則返回路徑
path = []
while cur_node:
path.append((cur_node.row, cur_node.col))
cur_node = cur_node.parent
return path[::-1] # 返回從起點到終點的路徑
# 將當前節(jié)點的相鄰未訪問節(jié)點加入棧中
for row, col in [(cur_node.row, cur_node.col-1), (cur_node.row+1, cur_node.col), (cur_node.row, cur_node.col+1), (cur_node.row-1, cur_node.col)]:
if is_valid(maze, row, col) and not visited[row][col]:
next_node = Node(row, col, cur_node)
stack.append(next_node)
visited[row][col] = True
return None # 如果沒有路徑,則返回 None
# 定義一個迷宮進行測試:
maze = [
[0, 1, 0, 0, 0],
[0, 1, 0, 1, 0],
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 1, 0]
]
start = (0, 0)
end = (4, 4)
print(solve_maze(maze, start, end))
# 輸出:[(0, 0), (1, 0), (2, 0), (2, 1), (2, 2), (3, 2), (4, 2), (4, 3), (4, 4)]

3 結(jié)語

針對解決“迷宮問題“,提出“廣度優(yōu)先搜索(BFS)”方法,證明該方法是有效的?;贐FS算法,使用棧來存儲待搜索單元,并通過判斷單元是否可以訪問和是否已經(jīng)訪問過來對節(jié)點進行遍歷。雖然該算法可以找到最短路徑,但由于棧的特性,它也可能導(dǎo)致一些路徑無法被找到。因此,在某些情況下,這種算法可能不是最佳選擇。

    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多