Oil Deposits (BFS)

杭电oj-1241 油藏

文章目录

题目

问题描述
GeoSurvComp地质勘测公司负责检测地下油藏。GeoSurvComp一次处理一个大矩形区域的土地,并创建一个将土地
划分为多个正方形图的网格。然后,它使用传感设备分别分析每个地块,以确定该地块是否包含油。包含油的地
块称为矿穴。如果两个凹坑相邻,则它们是同一油藏的一部分。积油可能很大,可能包含许多凹穴。您的工作是
确定网格中包含多少种不同的油藏。。

输入值
输入文件包含一个或多个网格。每个网格均以包含m和n的行开始,网格中的行和列数为m和n,并用单个空格分
隔。如果m = 0,则表示输入结束;否则,输入0。否则为1 <= m <= 100和1 <= n <=100。紧随其后的是m行,每
行n个字符(不计算行尾字符)。每个字符对应一个地块,要么是代表无油的“ *”,要么是代表油囊的“ @”。

输入量
对于每个网格,输出不同的油藏数量。如果两个不同的油藏在水平,垂直或对角线上相邻,则它们是同一油藏的
一部分。积油最多可容纳100个口袋。

样本输入
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5 
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 

样本输出
0
1
2
2

思路

先找到一个@然后从这里开始进行BFS搜索,把@本身以及周围的@都变成‘ * ’表示访问过这一片是一块油藏,然后继续在地图上找@。

代码

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int m,n;
char map[105][105];
int dx[8]={0,1,1,1,0,-1,-1,-1};                    //8个方位//
int dy[8]={1,1,0,-1,-1,-1,0,1};
void BFS();
bool noway(int x,int y);                          //判断是否有路//
struct Node{
  int x;
  int y;
}cur;
queue <Node> q;

int main (){
  while (scanf("%d%d",&m,&n) && m+n)
  {
    int ans=0;
    for (int i = 0; i <m ; ++i) {
      scanf("%s",map[i]);
    }
    for (int i = 0; i <m ; ++i) {
      for (int j = 0; j <n ; ++j) {
        if (map[i][j]=='@'){
          ans++;
          cur.x=i;
          cur.y=j;
          map[cur.x][cur.y]='*';
          q.push(cur);
          BFS();
        }
      }
    }
    printf("%d\n",ans);
  }
  return 0;
}

bool noway(int x,int y){
  if (map[x][y]=='*')
    return true;
  if (x<0 || x>=m || y<0 || y>=n)
    return true;
  return false;
}

void BFS(){
  Node next;
  while (!q.empty()){
    cur=q.front();
    q.pop();
    int nx,ny;
    for (int i = 0; i <8 ; ++i) {
      nx=cur.x+dx[i];
      ny=cur.y+dy[i];
      if (noway(nx,ny))
        continue;
    next.x=nx;
    next.y=ny;
    map[nx][ny]='*';
    q.push(next);
    }
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值