最近遇到了乙個較難的演算法題——迷宮求解,剛把棧與佇列學完,看完題面之後感覺有點想法,卻又一頭霧水。
有些問題看著簡單但執行起來很難,而有些問題看上去很難但執行起來,更難。
時間限制: 1 sec | 記憶體限制: 128 mb
描述:
有乙個 10 x 10 的迷宮,起點是『s』,終點是『e』,牆是『#』,道路是空格。乙個機械人從起點走到終點。當機械人走到乙個通道塊,前面已經沒有路可走時,它會轉向到當前面向的右手方向繼續走。如果機械人能夠過,則留下足跡『*』,如果走不通,則留下標記『!』。請你模擬機械人的走法輸出最終的狀態。
樣例輸入
##########
#s # # #
# # # #
# ## #
# ### #
# # #
# # # #
# ### ## #
## e#
##########
樣例輸出
##########
#**#!!!# #
# *#!!!# #
#**!!## #
#*### #
#***# #
# #***# #
# ###*## #
## ****#
##########
演算法框架,基本思路啊就是,
把迷宮中的每一塊當成一種元素型別乙個,然後利用棧的結構特點,讓機械人一步一步的探索。
如果可行,就向前邁進並留下乙個腳印,同時將這一塊壓入棧中。如果探索到某一步時發現四周無路可去(也就是可行方格塊),就退一步即元素出棧,然後再對當前位置尋找可行路徑。
就是這樣一步一步的探索,一點一點的入棧出棧,留下腳印、標記,直到走到終點,才停下腳步,繪製了這張迷宮路徑圖!
在開始描述演算法框架之前,需要用到幾個函式,分別是可行判斷、留下腳印、邁步探索、死路標記。
可行判斷
//判斷下一步的可行狀態
bool pass
(mazetype maze, postype curpos)
留下腳印
//留下腳印
int footprint
(mazetype &maze, postype curpos)
邁步探索
//探索下一步
postype nextpos
(postype curpos, int di)
return pos;
}
死路標記
//死路標記
int markprint
(mazetype &maze, postype curpos)
這些函式原型如果設定完成,這道題的準備工作就完成了,再利用上述的演算法框架將探索過程的函式原型還原,使其各函式間分工合作,即可完成最終的路徑圖。
#include
#include
#include
#define maxsize 1010
#define increment 100
typedef structpostype;
typedef structselemtype;
//新定義元素型別
typedef structmazetype;
//定義迷宮型別(二維字元陣列)
typedef structsqstack;
//構建
int init
(sqstack &s)
//判空
int empty
(sqstack &s)
//入棧
int push
(sqstack &
s,selemtype x)*s
.top++
=x;return1;
}//出棧
int pop
(sqstack &
s, selemtype &x)
//判斷下一步的可行狀態
bool pass
(mazetype maze, postype curpos)
//留下腳印
int footprint
(mazetype &maze, postype curpos)
//探索下一步
postype nextpos
(postype curpos, int di)
return pos;
}//死路標記
int markprint
(mazetype &maze, postype curpos)
//在地圖上探索路徑
int mazepath
(mazetype &maze, postype start, postype end)
else
if(e.di<4)
//對另外三個方向進行探索 }}
}while(!
empty(s
));return0;
} int main()
postype start, end;
//定義入口出口
for(i=
0; i<
10; i++
)//遍歷找到入口出口的座標
if(maze.arr[i]
[j]==
'e')}}
mazepath
(maze, start, end)
;//開始尋求路徑
for(i=
0; i)//列印最終的迷宮狀態
return0;
}
首先:
在邁步探索那個函式裡列舉了四中邁步方向,這裡順時針逆時針方向的選擇是要根據題目要求設定的,觀察樣例可以看出,機械人是從右開始順時針依次邁出腳步的。
第二:在提交到平台判機時,要勾選c++,如果選擇c語言,會報出編譯錯誤,提示是函式原型裡面的&出現問題。
還是想說一句,這道題讓我第一次接觸到了dfs(深度優先搜尋),寫得本萌新元氣大傷,真是,一如演算法深似海。。。
棧的應用舉例 迷宮求解
迷宮求解思路 求出所有的從入口到出口的路徑 do否則切換當前位置的東鄰方向為新的當前位置進行探索 否則 否則 while 棧不空 include include sqstack.h using namespace std state x y 用來表明當前 x,y 位置的狀態是否為通過,1表示通道,0...
棧的應用3 迷宮求解問題
看標題就是老計算機問題了,因為計算機的性質,窮舉法是乙個很好的方式,那麼就需要記錄當前點到出口的路徑,這時,棧就派上用場了。1.建立乙個二維陣列maze,0表示可以通過,1表示不行 2.因為有八個方向可以走 別問為什麼是八個,開始聽我也感覺很扯,後來就習慣了 因為每乙個方向都有乙個座標的變化,用二維...
棧的應用舉例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...