看標題就是老計算機問題了,因為計算機的性質,窮舉法是乙個很好的方式,那麼就需要記錄當前點到出口的路徑,這時,棧就派上用場了。
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則通 的,如果是通的,那...