// func3-1.cpp、algo3-5.cpp、algo3-9.cpp和algo3-11.cpp要呼叫的函式、結構和全域性變數struct postype // 迷宮座標位置型別(見圖3.9)
;#define maxlength 25 // 設迷宮的最大行列為25
typedef int mazetype[maxlength][maxlength]; // 迷宮陣列型別[行][列]
// 全域性變數
mazetype m; // 迷宮陣列
int x,y; // 迷宮的行數,列數
postype begin,end; // 迷宮的入口座標,出口座標
void print()
;#include"c3-1.h" // 採用順序棧儲存結構
#include"bo3-1.cpp" // 採用順序棧的基本操作函式
// 定義牆元素值為0,可通過路徑為1,不能通過路徑為-1,通過路徑為足跡
status pass(postype b)
void footprint(postype a)
void nextpos(postype &c,int di)
,,,}; // ,移動方向,依次為東南西北
c.x+=direc[di].x;
c.y+=direc[di].y;
}void markprint(postype b)
status mazepath(postype start,postype end) // 演算法3.3
else
if(e.di<3) // 沒到最後乙個方向(北)
}} }while(!stackempty(s));
return false;
}void main()
else
printf("此迷宮沒有從入口到出口的路徑\n");
執行結果如下:
從入口到出口的一條路徑由全域性變數m 陣列顯示。入口的值為1,路徑的值依次為
2,3,⋯,17。圖311 顯示了到達終點時棧的內容。其中棧元素的di 成員的值本是0~3,
為直觀,用東~北代替。由於有陣列m,棧的主要作用並不是儲存路徑。它的主要作用是
當試探失敗時,通過退棧回到前一點,從前一點再繼續試探。
這條路徑共走了16 步,從入口(第1 步)到第5 步其實只需走2 步。原因是nextpos()
函式的第1 句定義direc 陣列的移動方向依次為東南西北。程式由入口處先向東試探。既
然有路,就不再向南試探了。因此走了彎路。如果將direc[0] 和direc[1]的值交換一下,
新的移動方向依次為南東西北。這樣,程式先向南試探,只在不成功時才向東試探。避免
了走彎路,14 步就到了出口。以下是修改了direc 陣列的值(改nextpos()函式的第1 句為
postype direc[4]=,,,};),不改變輸入資料的情況下的執行結
果。為節約篇幅,略去相同部分,只列出最後結果。
m 陣列中,-1 表示曾試探過,但不能通行又退回去的路徑;除入口以外,1 表示沒有
走過的路徑;大於1 的值表示由入口通向出口的足跡。上面m 陣列第5 步的下面有2 個
-1。它們的值本是1(通道)。當走到第5 步時,入棧,說明第5 步走在5 行1
列,且下一步是向南走。向南走是通路,將m 陣列6 行1 列的值改為6(留下足跡),入棧
,當前足跡curstep 加1 為7。說明第6 步走在6 行1 列,且下一步也是向南
走。還是通路,將m 陣列7 行1 列的值改為7(將curstep 賦給m[7][1]),入棧
,當前足跡curstep 加1 為8。說明第7 步走在7 行1 列,且下一步也是向南
走。這時不再是通路,出棧。改變方向,入棧。說明第7 步仍是走在
7 行1 列,下一步改為向東走。依然沒有通路。7 行1 列的4 個方向上都不是1(走投無
路)。最後,將m 陣列7 行1 列的值改為-1,出棧,當前足跡curstep 減1 為6。
再出棧。改變方向,入棧。6 行1 列的4 個方向上也都不是1。最
後,將m 陣列6 行1 列的值改為-1,出棧,當前足跡curstep 減1 為5。再出棧
。改變方向,入棧。向第5 步的東面試探第6 步,⋯⋯,直到終點或
沒有通路。
*/
棧的應用舉例 迷宮求解
迷宮求解思路 求出所有的從入口到出口的路徑 do否則切換當前位置的東鄰方向為新的當前位置進行探索 否則 否則 while 棧不空 include include sqstack.h using namespace std state x y 用來表明當前 x,y 位置的狀態是否為通過,1表示通道,0...
迷宮求解(棧的應用)
最近遇到了乙個較難的演算法題 迷宮求解,剛把棧與佇列學完,看完題面之後感覺有點想法,卻又一頭霧水。有些問題看著簡單但執行起來很難,而有些問題看上去很難但執行起來,更難。時間限制 1 sec 記憶體限制 128 mb 描述 有乙個 10 x 10 的迷宮,起點是 s 終點是 e 牆是 道路是空格。乙個...
棧的應用3 迷宮求解問題
看標題就是老計算機問題了,因為計算機的性質,窮舉法是乙個很好的方式,那麼就需要記錄當前點到出口的路徑,這時,棧就派上用場了。1.建立乙個二維陣列maze,0表示可以通過,1表示不行 2.因為有八個方向可以走 別問為什麼是八個,開始聽我也感覺很扯,後來就習慣了 因為每乙個方向都有乙個座標的變化,用二維...