搜尋與回溯 1215 迷宮

2021-08-28 08:07:58 字數 1240 閱讀 7038

一天extense在森林裡探險的時候不小心走入了乙個迷宮,迷宮可以看成是由n * n的格點組成,每個格點只有2種狀態,.和#,前者表示可以通行後者表示不能通行。同時當extense處在某個格點時,他只能移動到東南西北(或者說上下左右)四個方向之一的相鄰格點上,extense想要從點a走到點b,問在不走出迷宮的情況下能不能辦到。如果起點或者終點有乙個不能通行(為#),則看成無法辦到。

第1行是測試資料的組數k,後面跟著k組輸入。每組測試資料的第1行是乙個正整數n (1 ≤ n ≤ 100),表示迷宮的規模是n * n的。接下來是乙個n * n的矩陣,矩陣中的元素為.或者#。再接下來一行是4個整數ha, la, hb, lb,描述a處在第ha行, 第la列,b處在第hb行, 第lb列。注意到ha, la, hb, lb全部是從0開始計數的。

k行,每行輸出對應乙個輸入。能辦到則輸出「yes」,否則輸出「no」。

2

3.##

..##..

0 0 2 2

5.....

###.#

..#..

###..

...#.

0 0 4 0

yes

no

此題採用搜尋與回溯,考慮到超時問題而且只需要有一條路徑就可以了,所以不需要回溯,關於輸出,我用了乙個flag檢查是否可以到達,剛開始我本來是用dfs的返回值來判斷是否可以到達,結果有問題,因為這樣的返回值是最後一條路徑是否可以到達。剛開始也沒有用到b陣列,後面發現這樣會無限迴圈,所以新增了乙個b[i]陣列判斷該點是否走過!

#include#include#include#define maxn 100+5

using namespace std;

int k,n,ha,la,hb,lb;

char a[maxn][maxn]={};

int da[5]=;

int db[5]=;

bool b[maxn][maxn]={};

int flag=0;

bool dfs(int x,int y)

for(int i=0;i<4;i++)

}cin>>ha>>la>>hb>>lb;

if(a[ha][la]=='#'||a[hb][lb]=='#')

b[ha][la]=1;

dfs(ha,la);

if(flag==1) cout<<"yes"

}

回溯法解決迷宮搜尋問題

演算法思路 定義乙個二維陣列,其中的0代表通路,1代表牆,然後定義乙個結構體表示每乙個節點的屬性,struct st 定義乙個棧,儲存路徑 然後定義乙個棧來儲存節點。include include include using namespace std 用棧實現路徑的儲存 define maxsiz...

棧 深度優先搜尋與回溯演算法求解迷宮

利用棧和回溯演算法求解迷宮 這是老師帶著做的,自己寫不知道什麼時候能調出來 這就是和老師的差距,這樣的程式他就10幾分鐘而已 code include define max row 5 define max col 5 int maze max row max col struct pointsta...

搜尋與回溯

搜尋與回溯 本詞條由 科普中國 科學百科詞條編寫與應用工作專案 審核 回溯演算法實際上乙個類似列舉的搜尋嘗試過程,主要是在搜尋嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就 回溯 返回,嘗試別的路徑。回溯法是一種選優搜尋法,按選優條件向前搜尋,以達到目標。但當探索到某一步時,發現原先選擇並不優...