廣搜 快走迷宮

2021-08-26 02:34:20 字數 2031 閱讀 3515

有乙個mn格的迷宮(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,檔案讀入這mn個資料和起始點、結束點(起始點和結束點都是用兩個資料來描述的,分別表示這個點的行號和列號)。現在要你程式設計找出最短的道路,要求所走的路中沒有重複的點,走時只能是上下左右四個方向。如果一條路都不可行,則輸出相應資訊(用-l表示無路)。

優先順序:左上右下

輸入格式:

第一行是兩個數m,n(1輸出格式:

字典序最小的路徑,描述乙個點時用(x,y)的形式,除開始點外,其他的都要用 「->」表示方向。 如果沒有一條可行的路則輸出-1。

輸入樣例#1:

5 6

1 0 0 1 0 1

1 1 1 1 1 1

0 0 1 1 1 0

1 1 1 1 1 0

1 1 1 0 1 1

1 15 6

輸出樣例#1:

(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
//快走迷宮 洛谷 

#include using namespace std;

int n,m;

int c[1000][1000],heng[1000],zong[1000],pre[1000];

int vis[1000][1000];

int head,tail;

int sx,sy,ex,ey,flag = head = tail = 0;

int dir[4][2] = ,,,};//左上右下

void print(int f)

void bfs(int x ,int y)

//如果沒到,那麼繼續進行for迴圈,知道結束,若結束還沒有找到,==沒有一條路徑 }}

} if(flag) break; }}

int main()

scanf("%d%d%d%d",&sx,&sy,&ex,&ey);

bfs(sx,sy);

if(flag == 0) printf("-1\n");

return 0;

}

思路解析:

迷宮裡最短路徑問題:要用廣搜 --- 很好理解:eg.先從起點開始走,先看周圍一圈有沒有終點,如果有的話,那麼直接走到終點。

廣搜(bfs)難點:要用乙個head , tail 來表示現在遍歷到哪了,head 表示節點,tail 表示擴充套件點。

1、先將head ,tail ,pre 要初始化,因為要輸出,所以用乙個前驅陣列pre[100]記錄一下移動之前的那個head(節點)。

2、使用while 迴圈,當這個佇列中有東西的時候才開始進行(head != tail)head的初始值為0,要將head++ 變為現有的tail,然後這個點進行擴充套件,現在的這個點不可以超出棋盤的範圍,但也不可以是0(0代表不能走),先對乙個點的擴充套件點進行搜尋,若都不是終點,那麼要將每乙個擴張點變為新的head(節點),再進行擴充套件,要將擴充套件點都放入佇列之中,所以 tail要 ++,並改記錄這個點的前驅(作為標記,方便之後的輸出),用兩個陣列分別記錄走到的點的橫縱座標,同時表示這個點已經被占領了。

3、如果現在這個點已經是終點了,那麼就需要列印(方法比較特殊),並且立乙個flag 表示可以找到一條路徑。

4、print()列印的函式:輸出迷宮的路徑要從頭到尾,但我們要輸出的時候,最後乙個點是終點,所以用pre陣列記錄之前的點的標號(head++相當於給每乙個節點標了號),當pre陣列所代表的數為1時,說明這個點是起點,從這個陣列開始輸出。

注意:1、這個print函式是乙個遞迴函式,(1)先找起點(2)找到起點之後,輸出起點(3)輸出起點之後退出一層迴圈,再繼續輸出,知道結束。(所以格式腰圍 if if else)

2、行走的方向要注意行和列:向左或向右時,行不變,列變,即x不變,y變

向上或向下時,行變,列不變,即x變,y不變

迷宮問題 廣搜

定義乙個二維陣列 int maze 5 5 queue 26 int head 0,tail 0,a 5 5 book 5 5 void function int tail 引數是隊尾 else function queue tail f 如果隊尾的父節點不是0 就將該父節點作為新的隊尾繼續呼叫 這...

迷宮 II 廣搜

問題描述 山山厭倦了普通的迷宮,他準備挑戰奇妙的迷宮 ii。迷宮 ii 是由若干三角形拼成的六邊形 見樣例 其中有些點可以通過,有些點不能通過。你需要計算從起點走到終點至少要經 過多少點 不包括起點終點 輸入格式 第一行,乙個整數 n,表示地圖邊長 接下來若干行字串,表示乙個地圖。其中.表示可以經過...

迷宮問題(廣搜與深搜)

定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。input 乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一解。output 左上角到右下角的最短路徑,格式如樣例所示。sa...