AcWing 1076 迷宮問題

2021-10-03 12:58:06 字數 1259 閱讀 4197

題目描述:

給定乙個 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 行,每...