AcWing 1076.迷宫问题 —— 记录路径的bfs

给定一个 n×nn×n 的二维数组,如下所示:

int maze[5][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,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

数据保证至少存在一条从左上角走到右下角的路径。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含 n 个整数 0 或 1,表示迷宫。

输出格式

输出从左上角到右下角的最短路线,如果答案不唯一,输出任意一条路径均可。

按顺序,每行输出一个路径中经过的单元格的坐标,左上角坐标为 (0,0)(0,0),右下角坐标为 (n1,n1)

数据范围

0n1000

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <queue>
 6 
 7 #define x first
 8 #define y second
 9 
10 using namespace std;
11 
12 typedef pair<int, int> PII;
13 
14 const int N = 1010;
15 int g[N][N];
16 PII pre[N][N];
17 int n;
18 
19 void bfs()
20 {
21     int dx[] = {0, 0, -1, 1}, dy[] = {1, -1, 0, 0};
22     queue<PII> q;
23     q.push({n - 1, n - 1});
24     pre[n - 1][n - 1] = {-1, -1};
25 
26     while (q.size())
27     {
28         PII t = q.front();
29         q.pop();
30         
31         for (int i = 0; i < 4; i ++ )
32         {
33             int x = t.x + dx[i], y = t.y + dy[i];
34             if (x < 0 || x >= n || y < 0 || y >= n) continue;
35             if (g[x][y] == 1) continue;
36             if (pre[x][y].x != 0 || pre[x][y].y != 0) continue;
37 
38             pre[x][y] = t;
39             if (x == 0 && y == 0) return;
40             q.push({x, y});
41         }
42     }
43 }
44 
45 int main()
46 {
47     scanf("%d", &n);
48     for (int i = 0; i < n; i ++ )
49         for (int j = 0; j < n; j ++ ) scanf("%d", &g[i][j]);
50 
51     bfs();
52 
53     PII end = {0, 0};
54 
55     while (1)
56     {
57         printf("%d %d\n", end.x, end.y);
58         if (end.x == n - 1 && end.y == n - 1) break;
59         end = pre[end.x][end.y];
60     }
61 
62     return 0;
63 }

记录路径只需使用一个pre数组用来记录当前状态是从那个状态转移过来即可。

posted @ 2021-01-22 17:04  筱翼深凉  阅读(170)  评论(0编辑  收藏  举报