題目傳送門
練習使用廣度優先搜尋時,記錄路徑的辦法,可以採用倒序的廣度優先搜尋,也可以採用正序的廣度優先搜尋,但倒序的**簡單些,正序的麻煩些。
#include using namespace std;
//邊權為1的時候,可以使用bfs求最短路徑
//學習:bfs中如何記錄路徑,就是把bool st[n][n]修改為pair型別,記錄前序是哪個點
//這樣,st就不光可以記錄走沒走過(沒走過的話,值為空,走過的話有pii值),而且可以通過pii反推回走的路線
#define x first
#define y second
typedef pairpii;
const int n = 1010, m = n * n;
int n;
int g[n][n]; //地圖
pii q[m]; //佇列
pii pre[n][n]; //前序座標
int dx = ; //上右下左
int dy = ; //上右下左
// bfs的特點決定它第一次找到的出口點,就是最短路徑
void bfs(int sx, int sy) ;
//初始化乙個不存在的值,用以區分是不是走過了
memset(pre, -1, sizeof pre);
pre[sx][sy] = ; //最後乙個位置(n-1,n-1)只要設定乙個非-1的值,就描述它走過了,防止重複走
while (hh <= tt) ; //將可以走的點入佇列
pre[a][b] = t; //記錄從t可以走到}}
}int main() ;
while (true)
return 0;
}
#include using namespace std;
//邊權為1的時候,可以使用bfs求最短路徑
//學習:bfs中如何記錄路徑,就是把bool st[n][n]修改為pair型別,記錄前序是哪個點
//這樣,st就不光可以記錄走沒走過(沒走過的話,值為空,走過的話有pii值),而且可以通過pii反推回走的路線
#define x first
#define y second
typedef pairpii;
const int n = 1010, m = n * n;
int n;
int g[n][n]; //地圖
pii q[m]; //佇列
pii pre[n][n]; //前序座標
int dx = ; //上右下左
int dy = ; //上右下左
void bfs(int sx, int sy) ;
//初始化乙個不存在的值,用以區分是不是走過了
memset(pre, -1, sizeof pre);
pre[sx][sy] = ; //最後乙個位置(n-1,n-1)只要設定乙個非-1的值,就描述它走過了,防止重複走
while (hh <= tt) ; //下乙個要檢查的座標
pre[a][b] = t; //從t可以走到}}
}int main() ;
path.push_back(start);
while (true)
for (int i = path.size() - 1; i >= 0; i--)
printf("%d %d\n", path[i].x, path[i].y);
return 0;
}
AcWing 1076 迷宮問題
題目描述 給定乙個 n n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 n 行,每...
AcWing 1076 迷宮問題
原題鏈結 考察 bfs 錯誤思路 定義結構體node,用node裡vector記錄路徑.此思路會tle,當n很大時,每次賦值都要消耗一定時間.正確思路 用陣列記錄路徑,即用pii 陣列記錄到達該點的上一步的座標.到時候再迭代即可.注意 當迭代的時候,不要重新定義pii it 最最注意 如果取單個座標...
AcWing 1076 迷宮問題 BFS 最短路
題目描述 給定乙個 n n 的二維陣列,如下所示 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。資料保證至少存在一條從左上角走到右下角的路徑。輸入格式 第一行包含整數 n。接下來 n 行,每...