棧的應用3 迷宮求解問題

2021-10-08 05:21:44 字數 1875 閱讀 9836

看標題就是老計算機問題了,因為計算機的性質,窮舉法是乙個很好的方式,那麼就需要記錄當前點到出口的路徑,這時,棧就派上用場了。

1.建立乙個二維陣列maze,0表示可以通過,1表示不行;

2.因為有八個方向可以走(別問為什麼是八個,開始聽我也感覺很扯,後來就習慣了),

因為每乙個方向都有乙個座標的變化,用二維陣列儲存避免了每一次都要進行計算。

move陣列:(到時候只需要i+move[方向][0]就行了)

3.防止每一次都測試邊界,在當前的二維陣列加一圈1;

4.另闢乙個陣列mark,專門存放哪些點是走過的,0&1即可。只有maze為0和mark顯示沒走過的才能走。

5.棧為三元組,分別為橫縱座標和當前是第幾個方向

從(1,1)點出發,按move陣列的順序走每乙個能走的方向,

走乙個點就壓入棧並在marks陣列標記,回退就退棧,當前點方向標識v加一,

迴圈退出的條件的走到了終點座標或者起始點座標。

如果最終回退到了(1,1)且這個點的方向數是8,說明這個迷宮沒有出去的路。

貼**:

void

work

(int maze[m]

[n],

int mark[m-1]

[n-1])

//m,n已經包括了外面的一圈

;//東 南 西 北 東南 東北 西南 西北

input

(head,i,j,v)

; mark[i]

[j]=1;

dofree

(head-

>next)

;//這個是起始點,存了兩遍但只需要輸出乙個

free

(head)

;return;}

if(!maze[g]

[h]&&

!mark[g]

[h])

else

if(v<8)

v++;else}}

while

(head-

>next&&v!=8)

; cout <<

"no way!"

<

}

這裡說明一下

void

input

(struct link* head,

int i,

int j,

int v)

;void

output

(struct link* head,

int input)

//輸入1就出棧&輸出

這兩個是壓棧和出棧函式。

壓棧的就是將三元組壓入,出棧和之前有點不同,有乙個整型變數控制著是直接彈出還是需要輸出。

這點改動還是可以接受的,如果不知道結構建議看一下我之前的棧的應用案例,裡面涉及到了棧adt。

主函式

int

main()

;for

(int i=

1;i1;i++

)//1不能通過,0可以

maze[i][0

]=1;

maze[i]

[n-1]=

1;} maze[0]

[0]=maze[0]

[n-1

]=maze[m-1]

[0]=maze[m-1]

[n-1]=

1;work

(maze,mark)

;return0;

}

就是將迷宮的邊圍一下,然後呼叫work函式,也是很簡單的。

迷宮求解(棧的應用)

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

棧的應用之求解迷宮問題(棧操作)

給定乙個m n的迷宮圖,求一條從指定入口和出口的迷宮路徑。假設迷宮圖如圖所示 m n 6的迷宮圖 為了表示迷宮,設定乙個陣列mg,其中每個元素表示乙個方塊的狀態,為0表示方塊是通道,為1表示方塊是障礙物 不可走 為了演算法方便,一般在迷宮的外圍加一條圍牆,例如上圖的迷宮表示為 由於迷宮四周加了一道圍...

棧求解迷宮問題

問題 假設下圖1是某迷宮的地圖 0代表路徑,1代表牆壁 問此迷宮是否有條通路?求解思想 用棧來實現解決問題,主要步驟是 1 將迷宮的入口座標設為當前座標 2 將當前座標壓棧,將當前座標上的值設為2 0變為2 代表已走過的路 3 判斷當前座標的四周 上下左右 是否是可以通 為0則通 的,如果是通的,那...