有乙個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...