F - Oil Deposits

Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。

Input

输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是n行,每行m个字符。每个字符对应一个小方格,并且要么是'*',代表没有油,要么是'@',表示有油。

Output

对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。

Sample Input

 
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 
 

Sample Output


0
1
2
2
 
 
解题思路:题目比较短小,容易理解。可以采用广度优先。广度优先采用的典型数据结构是优先队列。这里采用结构体记录位置。
首先从一个@出发,将此位置标记为已访问,并将所有能到达的位置标记为已访问(上下左右及对角线(8个位置),而且存在石油),并且加入队列中,当队列不为空时重复以上操作。为空后,继续枚举未访问而有石油的位置,调用BFS()。由此可见,石油的块数即为调用BFS()的次数。
注意:使用队列时要注意清空(这里while循环中没有其余的跳出循环语句,可以不用清空)。
        每一组数据测试之前对标记数组清零。
        memset()--之前都是一直用memset来清空一维数组
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体数组进行清零操作的一种最快方法.
        二维数组也适用:如memset(vis,0,sizeof(vis));/memset(&vis[0][0],0,sizeof(vis))。第一个参数为要操作数据的首地址。
 
收获感想:对BFS更加理解,之前队列用得也很少,通过做题,知道队列理解也不是那么困难。
 
#include<iostream>
#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std; int vis[][],n,m;
char Map[][]; struct node
{
int x,y;
}; queue<node> q; bool jd(int a,int b)
{
if(a>=&&a<n&&b>=&&b<m&&Map[a][b]=='@')
return true;
else return false;
} void BFS(node n){
while(!q.empty())q.pop();//初始化队列Q;
q.push(n);//可用结构体,也可以哈希一下
while(!q.empty()) {//当q不为空
node temp=q.front();//取出队首元素u;
q.pop();
int cx,cy;
cx=temp.x;
cy=temp.y;
if(jd(cx+,cy)&&vis[cx+][cy]==)
{//此区域合法且有油
vis[cx+][cy]=;//入队;访问标记;
temp.x=cx+;
temp.y=cy;
q.push(temp);
}
if(jd(cx+,cy+)&&vis[cx+][cy+]==)
{
vis[cx+][cy+]=;
temp.x=cx+;
temp.y=cy+;
q.push(temp);
}
if(jd(cx,cy+)&&vis[cx][cy+]==)
{
vis[cx][cy+]=;
temp.x=cx;
temp.y=cy+;
q.push(temp);
}
if(jd(cx-,cy+)&&vis[cx-][cy+]==)
{
vis[cx-][cy+]=;
temp.x=cx-;
temp.y=cy+;
q.push(temp);
}
if(jd(cx-,cy)&&vis[cx-][cy]==)
{
vis[cx-][cy]=;
temp.x=cx-;
temp.y=cy;
q.push(temp);
}
if(jd(cx-,cy-)&&vis[cx-][cy-]==)
{
vis[cx-][cy-]=;
temp.x=cx-;
temp.y=cy-;
q.push(temp);
}
if(jd(cx,cy-)&&vis[cx][cy-]==)
{
vis[cx][cy-]=;
temp.x=cx;
temp.y=cy-;
q.push(temp);
}
if(jd(cx+,cy-)&&vis[cx+][cy-]==)
{
vis[cx+][cy-]=;
temp.x=cx+;
temp.y=cy-;
q.push(temp);
}
}
} int main(){
while(cin>>n>>m)
{
if(n==&&m==) return ; for(int i=;i<n;i++)
for(int j=;j<m;j++)
cin>>Map[i][j]; memset(vis,,sizeof(vis)); int ans=;
node tp;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
if(Map[i][j]=='@'&&vis[i][j]==)
{
tp.x=i;tp.y=j;
BFS(tp);
ans++;
}
}
printf("%d\n",ans);
}
return ;
}

CSU-ACM2016暑期集训训练4-BFS(F - Oil Deposits)的更多相关文章

  1. F - Oil Deposits 【地图型BFS+联通性】

    The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...

  2. 暑假集训(1)第七弹 -----Oil Deposits(Poj1562)

    Description The GeoSurvComp geologic survey company is responsible for detecting underground oil dep ...

  3. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  4. 2014年CCNU-ACM暑期集训总结

    2014年CCNU-ACM暑期集训总结 那个本期待已久的暑期集训居然就这种.溜走了.让自己有点措手不及.很多其它的是对自己的疑问.自己是否能在ACM这个领域有所成就.带着这个疑问,先对这个暑假做个总结 ...

  5. 2014 SCAU_ACM 暑期集训

    暑期集训,希望能在这段时间获得对得起自己的提升吧 时间:7.11~8.30 集训各专题内容: 1.贪心,递推,基础DP(背包,区间DP,状态压缩DP(去年出了不少于2道铜牌题,看着办)) 2.搜索(B ...

  6. 8.10 正睿暑期集训营 Day7

    目录 2018.8.10 正睿暑期集训营 Day7 总结 A 花园(思路) B 归来(Tarjan 拓扑) C 机场(凸函数 点分治) 考试代码 A B C 2018.8.10 正睿暑期集训营 Day ...

  7. 8.6 正睿暑期集训营 Day3

    目录 2018.8.6 正睿暑期集训营 Day3 A 亵渎(DP) B 绕口令(KMP) C 最远点(LCT) 考试代码 A B C 2018.8.6 正睿暑期集训营 Day3 时间:5h(实际) 期 ...

  8. 8.9 正睿暑期集训营 Day6

    目录 2018.8.9 正睿暑期集训营 Day6 A 萌新拆塔(状压DP) B 奇迹暖暖 C 风花雪月(DP) 考试代码 A B C 2018.8.9 正睿暑期集训营 Day6 时间:2.5h(实际) ...

  9. 8.8 正睿暑期集训营 Day5

    目录 2018.8.8 正睿暑期集训营 Day5 总结 A 友谊巨轮(线段树 动态开点) B 璀璨光滑 C 构解巨树 考试代码 A B C 2018.8.8 正睿暑期集训营 Day5 时间:3.5h( ...

随机推荐

  1. MySQL中UNION和UNION ALL的使用

    在数据库中,UNION和UNION ALL关键字都是将两个结果集合并为一个,但这两者从使用和效率上来说都有所不同. MySQL中的UNION UNION在进行表链接后会筛选掉重复的记录,所以在表链接后 ...

  2. SCO连接AD / SCOM

    SCO安装完成后,下载IP包,打开Deployment Manager注册IP包,并将其部属到Runbook Server SCO IP包下载地址:http://technet.microsoft.c ...

  3. Codeforces Round #322 (Div. 2) C. Developing Skills 优先队列

    C. Developing Skills Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/581/p ...

  4. S5PV210(TQ210)裸机编程

    本文很多其它的是教会大家怎样学习. 4.1    汇编学习 4.1.1 基础知识     4.1.2 ARM模拟器 4.2    S5PV210启动流程 4.3    点亮一个LED 4.4    串 ...

  5. Struts2中的类型转换

    1.     Struts2中的类型转换 我们知道通过HTTP提交到后台的数据,都是字符串的形式,而我们需要的数据类型当然不只字符串类型一种.所以,我们需要类型转换! 在Struts2中,类型转换的概 ...

  6. linux内核系统调用和标准C库函数的关系分析

    http://blog.csdn.net/skyflying2012/article/details/10044343

  7. 编写程序,查找并删除forward_list<int>中的奇数元素

    #include<iostream> #include<forward_list> using namespace std; int main() { forward_list ...

  8. [021]转 C++ Pimpl机制

    出处:http://www.cnblogs.com/gnuhpc/ 1.简介 这个机制是Private Implementation的缩写,我们常常听到诸如“不要改动你的公有接口”这样的建议,所以我们 ...

  9. Java 8 Date Time API Example Tutorial – LocalDate, Instant, LocalDateTime, Parse and Format

    参考 Java 8 Date and Time API is one of the most sought after change for developers. Java has been mis ...

  10. (转)CentOS 6.5下Redis安装详细步骤

    Redis简介:Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作 ...