題目描述:
給定乙個 n×n 的二維陣列,如下所示:
int maze[5][5] = ;
它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。
資料保證至少存在一條從左上角走到右下角的路徑。
輸入格式
第一行包含整數 n。
接下來 n 行,每行包含 n 個整數 0 或 1,表示迷宮。
輸出格式
輸出從左上角到右下角的最短路線,如果答案不唯一,輸出任意一條路徑均可。
按順序,每行輸出乙個路徑中經過的單元格的座標,左上角座標為 (0,0),右下角座標為 (n−1,n−1)。
資料範圍
0≤n≤1000
輸入樣例:
5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出樣例:
0 0
1 02 0
2 12 2
2 32 4
3 44 4
分析:
本題是bfs求最短路徑的基本問題,不過輸出的是最短路徑而不是路徑的長度,所以可以在bfs過程中記錄下當前座標的上一步座標,為了方便輸出,可以從終點開始bfs到起點倒著遍歷。同時可以用pre陣列作為當前座標是否已被訪問的標誌陣列,當遍歷到起點時,可以直接return來剪枝。
#include #include #include using namespace std;
const int n = 1005;
typedef pairpii;
int g[n][n],n;
pii q[n*n],pre[n][n];
int dx = ;
int dy = ;
void bfs(int x,int y);
memset(pre,-1,sizeof pre);
pre[x][y] = ;
while(hh <= tt);
pre[nx][ny] = t;
if(!nx && !ny) return;}}
}int main()
}bfs(n - 1,n - 1);
pii t(0,0);
while(1)
return 0;
}
AcWing 1076 迷宮問題
原題鏈結 考察 bfs 錯誤思路 定義結構體node,用node裡vector記錄路徑.此思路會tle,當n很大時,每次賦值都要消耗一定時間.正確思路 用陣列記錄路徑,即用pii 陣列記錄到達該點的上一步的座標.到時候再迭代即可.注意 當迭代的時候,不要重新定義pii it 最最注意 如果取單個座標...
AcWing 1076 迷宮問題
題目傳送門 練習使用廣度優先搜尋時,記錄路徑的辦法,可以採用倒序的廣度優先搜尋,也可以採用正序的廣度優先搜尋,但倒序的 簡單些,正序的麻煩些。include using namespace std 邊權為1的時候,可以使用bfs求最短路徑 學習 bfs中如何記錄路徑,就是把bool st n n 修...
AcWing 1076 迷宮問題 BFS 最短路
題目描述 給定乙個 n n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 n 行,每...