棧的應用舉例2(迷宮求解)

2022-08-29 12:27:10 字數 2364 閱讀 1583

// 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.因為有八個方向可以走 別問為什麼是八個,開始聽我也感覺很扯,後來就習慣了 因為每乙個方向都有乙個座標的變化,用二維...