迷宫2(bfs + 堆优化)

 1 /**\
 2 https://ac.nowcoder.com/acm/contest/26077/1005
 3 从第i列第n行, 第1行m列添加起点, 然后bfs寻找能够分割两个点的墙
 4 
 5 注意:
 6 1、方向只能上下左右,因为对角线仍然可以穿过
 7 2、处理图的数据的时候可以将-1的墙标记为成本为0,
 8    为0的则不能变为墙,标记为1
 9 3、使用优先队列优化搜索的时间
10 \**/
11 #include <bits/stdc++.h>
12 #define int long long
13 using namespace std;
14 
15 const int N = 1e3 + 10;
16 const int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
17 
18 int n, m, t;
19 int dis[N][N], g[N][N];
20 
21 struct node {
22     int x, y, w;
23     bool operator < (const node& rhs) const {
24         return w > rhs.w;
25     }
26 };
27 
28 void accept() {
29     for(int i = 1; i <= n; ++i) {
30         for(int j = 1; j <= m; ++j) {
31             dis[i][j] = 1e18;
32             cin >> g[i][j];
33             if(g[i][j] == -1) g[i][j] = 0;
34             else if(g[i][j] == 0) g[i][j] = -1;
35         }
36     }
37 
38     priority_queue<node> q;
39 
40     for(int i = 1; i <= n; ++i) {
41         if(g[i][1] != -1) {
42             dis[i][1] = g[i][1];
43             q.push({i, 1, g[i][1]});
44         }
45     }
46 
47     for(int i = 1; i <= m; ++i) {
48         if(g[n][i] != -1) {
49             dis[n][i] = g[n][i];
50             q.push({n, i, g[n][i]});
51         }
52     }
53 
54     int ok = -1;
55 
56     while(!q.empty()) {
57         auto now = q.top();
58         q.pop();
59 
60         if(now.x == 1 || now.y == m) {
61             ok = now.w;
62             break;
63         }
64 
65         for(int i = 0; i < 4; ++i) {
66             int nx = now.x + d[i][0];
67             int ny = now.y + d[i][1];
68 
69             if(nx < 1 || nx > n || ny < 1 || ny > m || g[nx][ny] == -1 || g[nx][ny] + now.w >= dis[nx][ny]) continue;
70 
71             dis[nx][ny] = g[nx][ny] + now.w;
72             q.push({nx, ny, dis[nx][ny]});
73         }
74     }
75 
76     cout << ok << "\n";
77 }
78 
79 signed main()
80 {
81     ios::sync_with_stdio(false);
82     cin.tie(nullptr);
83 
84     cin >> t >> n >> m;
85     for(int i = 0; i < t; ++i)
86     {
87         accept();
88     }
89     return 0;
90 }

 

posted @ 2022-03-21 19:51  std&ice  阅读(78)  评论(0编辑  收藏  举报