# 思路:從乙個節點開始,尋找所有下乙個能繼續走的點,根據下乙個的點繼續尋找所有能走的點,直到該點等於出口。
# 方法:建立乙個空佇列,將起點位置進隊。在佇列不為空的時候迴圈:出隊一次。如果當前位置為出口,則結束演算法;
# 否則找出當前方塊的4個相鄰方塊中可走的方塊,加入佇列。
# 和stack的優勢:第乙個出隊的終點是最短路徑
from collections import deque
maze = [
[1,1,1,1,1,1,1,1,1,1],
[1,0,0,1,0,0,0,1,0,1],
[1,0,0,1,0,0,0,1,0,1],
[1,0,0,0,0,1,1,0,0,1],
[1,0,1,1,1,0,0,0,0,1],
[1,0,0,0,1,0,0,0,0,1],
[1,0,1,0,0,0,1,0,0,1],
[1,0,1,1,1,0,1,1,0,1],
[1,1,0,0,0,0,0,0,0,1],
[1,1,1,1,1,1,1,1,1,1],
]dirs = [
lambda x,y:(x+1,y),
lambda x,y:(x-1,y),
lambda x,y:(x,y+1),
lambda x,y:(x,y-1),
]#通過path找到最短路徑
def shortest_path(path):
shortestpath =
curnode = path[-1]
while curnode != path[0]:
curnode = path[curnode[2]] # 根據第三個元素找到前乙個點
shortestpath.reverse()
return shortestpath
def stack_maze(x1,y1,x2,y2):
queue = deque()
path =
maze[y1][x1] = -1 # 標記起點已經走過
while len(queue) > 0:
curnode = queue.popleft()
if curnode[0] == x2 and curnode[1] == y2:
print(shortest_path(path)) # 列印最短路徑
return true
for dir in dirs: # 找四個方向
nextnode = dir(curnode[0],curnode[1])
if maze[nextnode[1]][nextnode[0]] == 0 :
# 找到下一格路
maze[nextnode[1]][nextnode[0]] = -1 # 標記這格走過,防止死迴圈
print('死路')
return false
print(stack_maze(1,1,8,8))
資料結構 佇列 queue
佇列 就是生活中的排隊,因此排隊是先到先得,也是先離開隊伍,因此佇列也是採用的先進先出的概念 fifo,慢慢想想作業系統裡面是不是也用到fifo,自己去查吧 到底有沒有 如何能夠準確的定位是先進先出呢,因此採用的就是頭指標front和尾指標rear,通常這兩個指標是封裝成乙個鏈隊 注意front與r...
資料結構 佇列 queue
佇列 queue 是一種採用先進先出 fifo 策略的抽象資料結構,它的想法來自於生活中排隊的策略。顧客在付款結賬的時候,按照到來的先後順序排隊結賬,先來的顧客先結賬,後來的顧客後結賬。同棧的實現一樣,佇列的實現也有陣列實現和鍊錶實現兩種方式。先來看看陣列實現的方法。棧使用top變數記錄棧頂的位置,...
資料結構 佇列queue
佇列 佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端 front 進行刪除操作,而在表的後端 rear 進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列是有序集合,新新增的一端為隊尾,另一端為隊頭,當乙個元素從隊尾進入佇列時,一直...