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. Go2Shell

    1.背景 windows系统可以轻而易举地拿到文件所在目录, 但是mac显得想拿文件目录有点蛋疼.而Go2Shell可以快速定位到文件所在的目录. 2.安装配置 选择默认打开的终端软件 3.使用 进入 ...

  2. STL之Map的运用

    Map是c++的一个标准容器,她提供了非常好一对一的关系,在一些程序中建立一个map能够起到事半功倍的效果,总结了一些map基本简单有用的操作! 1. map最主要的构造函数:    map<s ...

  3. MySQL(16):Select-union(联合查询)

    1. Select-union(联合查询) union用于把来自许多SELECT语句的结果组合到一个结果集合中. 用法: SELECT ...UNION [ALL | DISTINCT]SELECT ...

  4. Android(java)学习笔记136:Java类初始化顺序

    Java类中初试化的顺序: 由此得出Java普通类初始化顺序结论: 静态变量 静态初始化块 变量 初始化块 构造器 由此得出Java继承类初始化顺序结论:     1 .继承体系的所有静态成员初始化( ...

  5. 0x800a1391-Microsoft Jscript "JSON未定义"

    本人在进行调试代码是遇到以下问题: 在运行到var result = JSON.parse(data);这句时,报错:JSON未定义.如下图:

  6. Android_SeekBar

    xml: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too ...

  7. svn管理代码在cornerstone上无法添加.a 静态库文件

    有时候.a静态库不能上传到svn的服务器  导致别人拉代码运行不了 这是因为cornerstone设置里面默认不会提交.a文件, 在上图选项栏里是cornerstone默认忽略上传的文件名后缀,在这里 ...

  8. [置顶] operator overloading(操作符重载,运算符重载)运算符重载,浅拷贝(logical copy) ,vs, 深拷贝(physical copy)

    operator overloading(操作符重载,运算符重载) 所谓重载就是重新赋予新的意义,之前我们已经学过函数重载,函数重载的要求是函数名相同,函数的参数列表不同(个数或者参数类型).操作符重 ...

  9. 项目移植过程中报:“Project facet Java version 1.7 is not supported.” 错误

    转载: http://my.oschina.net/nly/blog/349081 在移植eclipse项目时,如果遇到 报:“Project facet Java version 1.7 is no ...

  10. JavaScript中的作用域与函数和变量声明的提升

      var foo = 1; function bar() {     if (!foo) {         var foo = 10;     }     alert(foo); } bar(); ...