POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)

 1 /*
 2     bfs搜索!要注意的是点与点的权值是不一样的哦!
 3    空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去)
 4    所以用到优先队列进行对当前节点步数的更新!      
 5 */
 6 #include<iostream>
 7 #include<queue>
 8 #include<cstring>
 9 #include<algorithm>
10 #include<cstdio>
11 using namespace std;
12
13 int n, m;
14 char map[305][305];
15
16 struct node{
17     int x, y;
18     int step;
19     node(){}
20     node(int x, int y, int step){
21        this->x=x;
22        this->y=y;
23        this->step=step;
24     }
25 };
26 int dir[4][2]={0, 1, 1, 0, -1, 0, 0, -1};
27
28 bool operator >(node a, node b){
29    return a.step > b.step;
30 }
31
32 priority_queue<node, vector<node>, greater<node> >q;
33
34 bool bfs(){
35    while(!q.empty()){
36        node cur=q.top();
37        q.pop();
38        if(map[cur.x][cur.y]==‘T‘){
39            cout<<cur.step<<endl;
40            return true;
41        }
42        int xx, yy;
43        for(int i=0; i<4; ++i){
44            xx=cur.x+dir[i][0];
45            yy=cur.y+dir[i][1];
46            if(map[xx][yy]==‘R‘ || map[xx][yy]==‘S‘) continue;
47            else if(map[xx][yy]==‘T‘){
48               cout<<cur.step+1<<endl;
49               return true;
50            }
51            else if(map[xx][yy]==‘B‘)
52               q.push(node(xx, yy, cur.step+2));
53            else
54               q.push(node(xx, yy, cur.step+1));
55
56            map[xx][yy]=‘R‘;
57        }
58    }
59    return false;
60 }
61
62 int main(){
63     while(cin>>n>>m && (n || m)){
64         for(int i=1; i<=n; ++i){
65             cin>>(map[i]+1);
66             map[i][0]=map[i][m+1]=‘R‘;
67             for(int j=1; j<=m; ++j){
68                 if(map[i][j]==‘Y‘){
69                    q.push(node(i, j, 0));
70                    map[i][j]=‘R‘;
71                 }
72                 map[0][j]=map[n+1][j]=‘R‘;
73             }
74         }
75         if(!bfs())
76            cout<<"-1"<<endl;
77         while(!q.empty())  q.pop();
78      }
79     return 0;
80 } 
 1 /*
 2     将map[i][j]映射到 i*m+j的节点上,建立节点与节点之间的权值的关系!
 3     B->B的权值为1, E->B的权值为2, S<->...  R<->... 的权值为INF(也就是没有边存在)
 4     在注意一点就是B->E的权值是 1,因为如果到B了,说明炮弹已经将墙轰掉了!
 5
 6     建立好图之后,那么就是求源点到终点的最短的距离了!
 7     这里采用的spfa算法!
 8 */
 9
10 #include<iostream>
11 #include<cstdio>
12 #include<cstring>
13 #include<algorithm>
14 #include<vector>
15 #include<queue>
16 #define N 90010
17 #define INF 0x3f3f3f3f
18 using namespace std;
19 struct node{
20    int to;
21    int dist;
22    node(){}
23
24    node(int to, int dist){
25      this->to=to;
26      this->dist=dist;
27    }
28 };
29 vector<node>g[N];
30 int vis[N], d[N];
31 char map[305][305];
32 int dir[4][2]={0, 1, 1, 0, -1, 0, 0, -1};
33 int ss, tt;
34 int n, m;
35 queue<int>q;
36 bool spfa(){
37    q.push(ss);
38    memset(vis, 0, sizeof(vis));
39    vis[ss]=1;
40    memset(d, 0x3f, sizeof(d));
41    d[ss]=0;
42    while(!q.empty()){
43        int u=q.front(); q.pop();
44        vis[u]=0;
45        int len=g[u].size();
46        for(int i=0; i<len; ++i){
47            int v=g[u][i].to;
48            if(d[v] > d[u] + g[u][i].dist){
49                  d[v] = d[u] + g[u][i].dist;
50
51                  if(!vis[v]){
52                  q.push(v);
53                  vis[v]=1;
54               }
55            }
56        }
57    }
58    if(d[tt]==INF)  return false;
59    return true;
60 }
61
62 int main(){
63    while(cin>>n>>m && (n||m)){
64       for(int i=0; i<n; ++i)
65         cin>>map[i];
66       for(int i=0; i<n; ++i)
67          for(int j=0; j<m; ++j){
68              int from=i*m+j;
69              if(map[i][j]==‘Y‘)  ss=from;
70              else if(map[i][j]==‘T‘) tt=from;
71              else if(map[i][j]==‘R‘ || map[i][j]==‘S‘) continue;
72              for(int k=0; k<4; ++k){
73                  int x=i+dir[k][1];
74                  int y=j+dir[k][0];
75                  if(x<0 || x>=n || y<0 || y>=m)  continue;
76                  if(map[x][y]==‘R‘ || map[x][y]==‘S‘) continue;
77
78                  int to = x*m+y, dist=1;
79                  if(map[i][j]==‘B‘ || map[x][y]==‘B‘)  dist=2;
80                  if(map[i][j]==‘B‘ && map[x][y]!=‘B‘)  dist=1;
81                  g[from].push_back(node(to, dist));
82
83              }
84          }
85        if(!spfa())
86           cout<<"-1"<<endl;
87        else cout<<d[tt]<<endl;
88        for(int i=0; i<n*m; ++i)
89           g[i].clear();
90    }
91    return 0;
92 } 

POJ 2312Battle City(BFS-priority_queue 或者是建图spfa),布布扣,bubuko.com

时间: 2024-10-10 15:52:03

POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)的相关文章

hdu2377Bus Pass(较为复杂的建图+spfa)

题目链接: 啊哈哈,点我点我 思路: 题目是给了很多个车站,然后要你找到一个社区距离这些车站的最大值最小..所以对每个车站做一次spfa,那么就得到了到每个社区的最大值,最后对每个社区扫描一次,得到那个最大最小值..还有题目要求是要最小的id,所以排一次序. 题目: Bus Pass Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6

POJ 2502 Subway (Dijkstra 最短路+建图)

Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Description You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. Instead of getting to ride your bike to school every day, you now get

POJ A Plug for UNIX (最大流 建图)

Description You are in charge of setting up the press room for the inaugural meeting of the United Nations Internet eXecutive (UNIX), which has an international mandate to make the free flow of information and ideas on the Internet as cumbersome and

POJ 2724 奶酪消毒机 二分匹配 建图 比较难想

Purifying Machine Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5004   Accepted: 1444 Description Mike is the owner of a cheese factory. He has 2N cheeses and each cheese is given a binary number from 00...0 to 11...1. To keep his chee

POJ 3498【最大流+拆点建图】

题意: 在X,Y坐标系中有N(N<=100)个冰块...有些冰块上有若干只企鹅..每只企鹅一次最多跳M距离..一个冰块在有Mi个企鹅离开..就会消失..问有哪些冰块可以作为集合点..就是所有企鹅都能成功到这个冰块上来. 这个题建图比较有意思. 把每块冰分成两个点i和i+n. i表示进入i冰块的点(可以有无数企鹅过来,所以从别的冰到i有边,容量为INF) i+n表示从i冰块出去的点(最多只能有Mi企鹅从这跳出去,所以从i到i+n有边,且容量为Mi) 从源点S到i有边(S, i, i点初始企鹅数).

Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖

题意:图没什么用  给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖       最小路径覆盖=|G|-最大匹配数                   证明:https://blog.csdn.net/qq_34564984/article/details/52778763 证明总的来说就是尽可能多得连边 边越多 可以打包一起处理得点就越多(这里题中打包指连续得两个点只需要一条线段就能覆盖) 拆点思想   :匈牙

POJ 3592--Instantaneous Transference【SCC缩点新建图 &amp;&amp; SPFA求最长路 &amp;&amp; 经典】

Instantaneous Transference Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6177   Accepted: 1383 Description It was long ago when we played the game Red Alert. There is a magic function for the game objects which is called instantaneous

POJ 3281 Dining(最大流建图 &amp;&amp; ISAP &amp;&amp; 拆点)

题目链接:http://poj.org/problem?id=3281 努力练建图ing!!! 题意:有 N 头牛,有 F 种食物和 D 种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料. 第2行-第N+1行.是牛i 喜欢A种食物,B种饮料,及食物种类列表和饮料种类列表. 问最多能使几头牛同时享用到自己喜欢的食物和饮料.->最大流. 本题难点是建图: 思路:一般都是左边一个集合表示源点与供应相连,右边一个集合表示需求与汇点相连. 但是本题,牛作为需求仍然是一个群体,但是供

建图方式一 之 ”前向星“ BFS&amp;&amp;DFS 简单应用

三种建图方式,邻接矩阵.前向星(边表集).邻接链表! 耗时一晚上 ,好好研究了一下 前向星,因为我的指针用的实在是很烂,所以还是 入赘 前向星吧. 问了学长,看了大牛们的博客,终于有点收获了,个人认为 前向星Very Well. 前向星 建图方法: 以储存边的方式来储存图.在构造图时,把边存放在数组里,不需使用指针,只需一个 next  即可是整个图构建完成 . 适用条件: 点集特别多的稀疏图,边数多且繁杂,开邻接矩阵会浪费大量内存. 时间复杂度: O(m),并不比邻接链表差. #include