迷宮求解(棧的應用)

2021-09-12 01:30:52 字數 3329 閱讀 9840

最近遇到了乙個較難的演算法題——迷宮求解,剛把棧與佇列學完,看完題面之後感覺有點想法,卻又一頭霧水。

有些問題看著簡單但執行起來很難,而有些問題看上去很難但執行起來,更難。

時間限制: 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...