棧的應用 迷宮演算法(棧和回溯思想)

2021-08-21 22:14:11 字數 1510 閱讀 1832

人生,就像乙個很大的棧演變。出生時赤條條地來到這個世界,慢慢地長大,漸漸地變老,最終還得赤條條地離開世間。

思路分析:

上面是乙個迷宮地圖,在地圖上,0 代表牆,1 代表通路。

迷宮是回溯法和棧的綜合應用。

下面給出完整的思路和尋路演算法:

這裡我們只研究一種情況:地圖只有一條路徑可以出去。

尋路演算法按照上下左右的順序進行遍歷和判斷。

從入口出發,按照上下左右的順序尋路,每次的路徑座標pos放到棧中,存放座標是為了方便回溯。如上圖,直到向上沒有通路了,再檢視當前位置,左,右是否有通路,實際如圖所示,沒有。那麼就取棧頂座標,回退一步,再檢視左右是否有通路。如此迴圈。

如果不停地回退,導致棧中沒有元素,這就說明回退到了迷宮入口。那麼就可以說明此迷宮沒有通路。

在迷宮中還有一點值得注意就是對是否為地圖邊界 的判斷。

下面給出核心**:

迷宮定義:

#define n 10

typedef

struct pospos;

typedef

struct maze

maze;

尋路演算法:

int checkisaccess(maze *m, pos pos)

return0;}

void mazegetpath(maze* m)

pos next = cur;

//上next._row -= 1;

if(checkisaccess(m, next) == -1)

//下next = cur;

next._row += 1;

if(checkisaccess(m, next) == 1)

//左next = cur;

next._col -= 1;

if(checkisaccess(m, next) == 1)

//右next = cur;

next._col += 1;

if(checkisaccess(m, next) == 1)

//回溯

stackpop(&s);

}printf("沒有通路\n");

}

棧的應用 迷宮

使用c 構建帶環迴路迷宮,並使用迭代法,遞迴法求出口 使用遞迴方法求迷宮的最短路徑 其實在列印最短路徑是使用佇列的話路徑就不是反著的了 pragma once includeusing namespace std include includetypedef struct pos pos class...

棧的應用之迷宮

棧是後進先出的,棧分為順序棧和鏈棧 順序棧是由一組位址連續的儲存單元構成,依次存放從棧底到棧頂的資料元素 鏈棧是一組位址可不連續的儲存單元構成,鏈棧的建立過程類似於採用前插法建立鍊錶 注意程式中棧的操作,push pop gettop 等等。網上有一段利用棧完成的程式,可以拿來欣賞一下,首先感謝一下...

棧的應用之迷宮

利用棧對迷宮求解,採用的基本方法是回溯法,其實也算是一種暴力破解吧.畢竟是將乙個乙個方塊檢驗直至終點或者棧空。入棧 當棧頂元素方塊周圍有可行方塊時,將該可行方塊入棧 出棧 當棧定元素的方塊周圍都沒有可行方塊時,出棧 有幾點需要注意 1.當棧頂元素彈出時,我們又要重新對棧頂元素周圍的方塊進行檢驗,為避...