棧的應用舉例 迷宮求解

2021-06-22 23:16:22 字數 2529 閱讀 9386

迷宮求解思路(求出所有的從入口到出口的路徑):

do否則切換當前位置的東鄰方向為新的當前位置進行探索;}否則

否則}}}while(棧不空)

#include#include"sqstack.h"

using namespace std;

//state[x][y]用來表明當前(x,y)位置的狀態是否為通過,1表示通道,0表示牆

int state[10][10]=,,,

,,,,

,,};postype arrayfoot[100];//記錄留下的未重複過的足跡

postype arrayfoot1[100];//記錄不能通過的足跡

static int i=0;//定義成靜態變數,防止每次被呼叫,i都被重新賦值

status footprint(postype *foot,postype curpose)

//footprint

status delfootprint(postype *foot,postype curpose)

//delfootprint

status markprint(postype seat,int flag)

//markprint

status pass(postype curpose)//pass()

//if

i++;

}//while

if(-1!=arrayfoot[i].x)//說明當前足跡與曾經留下的足跡有相同,則當前位置是不可通過

return 0;

else

return 1;//留下的足跡遍歷完也沒有找到與當前位置相同的足跡,說明是新的通道塊

}//if

else

return 0;//當前通道塊是牆

};//pass

postype nextpos(postype curpos,int di)//以東為先,順時針旋轉

//switch

return nextpos;

}//nextpos

status mazepath(sqstack &s, sqstack &ss,postype start,postype end)

{ sop.initstack(s);sop.initstack(ss);//初始化棧s,ss

selemtype e;

postype curpos=start;//設定「當前位置」為「入口位置」

int curstep=1,flag=0;//探索第一步

do {

if(pass(curpos))//當前位置可以通過,即是未曾走到過的通道塊

{ e.ord=curstep;e.seat=curpos;e.di=1;

sop.push(s,ss,e);//加入路徑

footprint(arrayfoot,curpos);//留下足跡

if(curpos.x==end.x&&curpos.y==end.y)//到達終點,即出口

{flag++;

status (*vis)(selemtype);

vis=visit;

cout<

int state[10][10]//設定為全域性邊變數是為了資料在函式中能夠被修改

postype arrayfoot[100];//記錄留下的未重複過的足跡,由於此時所有陣列值均被**初始化為(0,0),與**中入口位置(0,0)重複無法比較,初始化第乙個元素為(-1,-1)並且每次操作後均在末尾賦值(-1,-1)在陣列遍歷式就能以(-1,-1)作為結束條件。

footprint(postype *foot,postype curpose)//陣列指標做形參,在函式中修改的陣列值能夠儲存到陣列中

sop.push(s,ss,e);//加入路徑

footprint(arrayfoot,curpos);//留下足跡

//每次入棧就留下足跡,避免重複走

sop.pop(s,e);//彈出di指向當前不能通過的道路塊的前道路塊

delfootprint(arrayfoot,e.seat);

//每次出棧就擦除足跡。假設有2條成功路徑:

第1種:……(5,7)->(5,8)->(6,8)->(7,8)->(8,8)

第2種:……(5,7)->(6,7)->(6,8)->(7,8)->(8,8)

若每次出棧都不擦除足跡,則完成第1路徑進行第2路徑則由於(6,8)->(7,8)->(8,8)已經保留了足跡則不能被通過,第2路徑無法完成。由於每次出棧之後,資料的查詢方向均順時針加1,因此不會重複剛才路徑,只需保持棧中元素留有記錄即可。

程式進行的總體思想總結:

假設存在第一次成功出逃迷宮的路徑,若棧中有n個元素,則刪除「出口」(即編號為n的元素),尋找第n-1個元素到到n的另一條路徑,若第n-1個元素不存在其餘到達n的路徑,則尋找從第n-2到n的其餘路徑,依次類推……,直到第1個元素到n的其他路徑。

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

func3 1.cpp algo3 5.cpp algo3 9.cpp和algo3 11.cpp要呼叫的函式 結構和全域性變數 struct postype 迷宮座標位置型別 見圖3.9 define maxlength 25 設迷宮的最大行列為25 typedef int mazetype max...

迷宮求解(棧的應用)

最近遇到了乙個較難的演算法題 迷宮求解,剛把棧與佇列學完,看完題面之後感覺有點想法,卻又一頭霧水。有些問題看著簡單但執行起來很難,而有些問題看上去很難但執行起來,更難。時間限制 1 sec 記憶體限制 128 mb 描述 有乙個 10 x 10 的迷宮,起點是 s 終點是 e 牆是 道路是空格。乙個...

棧的應用3 迷宮求解問題

看標題就是老計算機問題了,因為計算機的性質,窮舉法是乙個很好的方式,那麼就需要記錄當前點到出口的路徑,這時,棧就派上用場了。1.建立乙個二維陣列maze,0表示可以通過,1表示不行 2.因為有八個方向可以走 別問為什麼是八個,開始聽我也感覺很扯,後來就習慣了 因為每乙個方向都有乙個座標的變化,用二維...