Oil Deposits HDU - 1241 并查集思想 + bfs搜索
题目
在第一次植物僵尸世界大战中,植物国的黑玫瑰王子使用了植物国的超超超超级无敌禁术-----”BUG”,开启了异次元的大门,在一位超超超超…级的指挥官”辅助器”带领下,打败了僵尸王国,但是也因此植物国大伤元气,无法再得到异次元的帮助。过了10000年后,僵尸国王子为了国家的荣誉和发扬祖先的”诺克萨斯”精神,打算采取”闪电战”战术,一举歼灭植物国的战略要塞,吹起第二次植物僵尸世界大战的号角,但是僵尸王子需要知道植物国现在有几个战略要塞,才能采取进一步措施,于是开始研究植物国的军事图。
因为僵尸国卫星技术先进,该军事图十分清楚明了,是一个二维的电子网格图,图中只有黑色和白色,只要图中的白色方块外一圈的八个方块中有白色方块,说明它们属于同一个战略要塞。Input多组输入(m = 0结束输入)。
军事图是m*n的二维图,图中”@”表示白色,”s”表示黑色。
第一行包含m,n(1<=n,m<=100),
接下来m行,每行n个字符。Output对于每组输入,输出植物国的战略要塞数量。
Sample Input
1 1
s
3 5
s@s@s
s@s
s@s@s
1 8
@@ssss@s
5 5
ssss@
s@@s@
s@ss@
@@@s@
@@ss@
0 0
Sample Output
0
1
2
2
解
我们对每个可能‘@’进行广搜,八个方向,是否在同一区域内,通过ans 、pre进行标记
细节看代码
ac代码
#include<iostream>
#include<cstdio>
#include<queue>
#include<string.h>
#include<string>
#include<algorithm>
#define inf 0x3f3f3f3f
#include<map>
using namespace std;
typedef struct
{int x,y;int ans; //当前节点编号int pre; //其父节点编号
}status;
char mp[105][105];
int vis[105][105]; //访问标记
int op[8][2]={{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}}; //八个方向操作
int n,m;
int bfs(vector<status> &fa,map<pair<int ,int >,int > ans)
{memset(vis,0,sizeof(vis));for(int i=0;i<fa.size();i++){if(fa[i].ans==fa[i].pre) //当两个节点不在一个块内的时后进行广搜{queue<status > q;q.push(fa[i]);while(!q.empty()){status tp;tp = q.front();vis[tp.x][tp.y] = 1;q.pop();for(int i=0;i<8;i++){int dx = tp.x + op[i][0];int dy = tp.y + op[i][1];if(dx>=1&&dx<=n&&dy>=1&&dy<=m&&!vis[dx][dy]&&mp[dx][dy]=='@'){fa[ans[make_pair(dx,dy)]].pre = tp.ans; //在同一个区域 将其节点指向父节点vis[dx][dy] = 1;status New;New = fa[ans[make_pair(dx,dy)]];q.push(New);}}}}}int count = 0;for(int i=0;i<fa.size();i++) //计算块数{if(fa[i].ans==fa[i].pre)count++; }return count;
}
int main()
{while(~scanf("%d%d",&n,&m)){if(n==0&&m==0) break;vector<status> fa; //存放'@' 节点map<pair<int ,int >,int > ans; //用作x,y索引 fa内的节点int cnt =0;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf(" %c",&mp[i][j]);if(mp[i][j]=='@'){status New;New.x = i;New.y = j;New.ans = cnt;New.pre = cnt;fa.push_back(New);ans[make_pair(i,j)] = cnt;cnt++;}}printf("%d\n",bfs(fa,ans));}return 0;
}
Oil Deposits HDU - 1241 并查集思想 + bfs搜索相关推荐
- L - Oil Deposits HDU - 1241
L - Oil Deposits HDU - 1241 注意写check的时候要先判x,y是不是越界了,不然直接用数组可能RE, 也可能直接WA了 #include<cstdio> #in ...
- hdu 5606(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5606 解题思路: 这题实际上是要找一些连通的节点,使得边上的权值都为0. 很明显,首先把权值为0的边都 ...
- hdu 2473(并查集+删除操作)
解题思路:这道题有并查集的删除操作,如果直接对这一棵树进行删除节点操作肯定是很困难的.所以可以建立虚拟节点,只要有一个节点要被删除,就直接把它投影到虚拟节点上,即用这个虚拟节点来代替我们要删除的节点. ...
- HDU 5441并查集 by cyl
HDU 5441 题意: 杰克喜欢旅游,从城市a到城市b是他最喜欢的,现在有n个城市m个路. 当杰克在从城市a到城市b 的时候需要坐车,但是需要有等待时间t,他无法忍受超过x 的等待时间. ...
- hdu 1232 并查集
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) ...
- hdu 4907(并查集)
Task schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pr ...
- hdu 3172(并查集+hash)
解题思路:典型的并查集,只是每个人的名字要转换成数字,可以用map,也可以用字典树,我最开始用的字典树结果爆内存了.. 爆内存: #include<iostream> #include&l ...
- hdu 3081(并查集+最大流)
题目大意: n个男孩n个女孩,女孩选男孩,每个女孩都要选到不同的人 k对女孩有相同选择标准, 女孩每轮都选择没选过的男孩, 问总共能选几轮.解题思路:女孩编号1......n,男孩编号n+1,n+2, ...
- hdu 5441 (并查集)
题意:给你n个点,m条边构成无向图.q个询问,每次一个值,求有多少条路,路中的边权都小于这个值 a->b 和 b->a算两种 思路:把权值从小到大排序,询问从小到大排序,如果相连则用并查集 ...
最新文章
- http 安全性和幂等性_HTTP方法:幂等性和安全性
- HTML 页面源代码布局介绍
- mybatis框架执行原理简单实现
- MySQL redis如何实现_如何保障mysql和redis之间的数据一致性?(转发)
- 第三章 选择结构
- C#网络编程----文件流
- mysql数据封装是什么_MySql数据封装操作类
- 天玑9000和骁龙8 gen1哪个好 天玑9000和骁龙8 gen1差距
- 看一遍都懂的数组遍历~确定不试试?
- 蚂蚁庄园运动会登山赛!3d项目入门实战!Cocos Creator 3D!
- Linux云计算学习笔记day39
- K3+note+android+6.0,联想k3note升级Android 6.0教程[多图]
- python项目——外星人入侵游戏
- PHP语言之面向对象编程
- Matlab-mex
- 在python中使用opencv自带函数转换转换RBG和BGR
- Maven3 Archetype ArtifactId大全及简单说明
- 根据交换机端口分配固定地址的方法
- 短信中出现的短网址有危险吗?
- 电阻、电容、电感的高频特性