AcWing 1076 迷宮問題

2022-10-01 13:24:11 字數 1866 閱讀 2548

題目傳送門

練習使用廣度優先搜尋時,記錄路徑的辦法,可以採用倒序的廣度優先搜尋,也可以採用正序的廣度優先搜尋,但倒序的**簡單些,正序的麻煩些。

#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 行,每...