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

2021-03-01 15:26

阅读:377

标签:preview   queue   turn   type   element   front   编程   转移   pac   

给定一个 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),右下角坐标为 (n?1,n?1)

数据范围

0n1000

 1 #include  2 #include  3 #include  4 #include 
 5 #include  6 
 7 #define x first
 8 #define y second
 9 
10 using namespace std;
11 
12 typedef pairint, 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 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  )
49         for (int j = 0; j "%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数组用来记录当前状态是从那个状态转移过来即可。

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

标签:preview   queue   turn   type   element   front   编程   转移   pac   

原文地址:https://www.cnblogs.com/HYfeng-yanwu/p/14314301.html


评论


亲,登录后才可以留言!