Oil Deposits /DFS

Oil Deposits

GeoSurvComp地质调查公司负责探测地下油藏。GeoSurvComp每次只处理一个大的矩形区域,并创建一个划分的网格把土地分成许多正方形的地块。然后利用传感设备分别分析每个地块确定该地块是否含有石油。

含有石油的地块被称为油穴。如果两个口袋是相邻的,那么它们是相同的一部分石油储蓄。石油矿床可能相当大,并可能包含许多小块。你的工作是决定网格中包含多少种不同的储蓄。

Input

输入文件包含一个或多个网格。每个网格以包含m和n(数字)的一行开始

网格中的行和列,用一个空格隔开。如果m = 0,表示输入结束; 否则,1≤m≤100,1≤n≤100。后面是m行,每行n个字符(不计算行尾字符)。每个字符对应一个情节,或者是“*”,表示无油,或“@”,表示油袋。

Output

对于每个网格,输出不同的石油矿床的数量。两个不同的口袋是同一种油的一部分如果它们水平、垂直或对角线相邻,则沉积。一个石油矿床不会包含更多的石油超过100的口袋。
 

Sample Input

1 1

*

3 5

*@*@*

**@**

*@*@*

1 8

@@****@*

5 5

****@

*@@*@

*@**@

@@@*@

@@**@

0 0

Sample Output

0

1

2

2

#include<cstdio>
#include<cstring>
const int maxn = 100 + 5;

char pic[maxn][maxn];
int m, n, idx[maxn][maxn];

void dfs(int r, int c, int id) {
  if(r < 0 || r >= m || c < 0 || c >= n) return;
  if(idx[r][c] > 0 || pic[r][c] != '@') return;
  idx[r][c] = id;
  for(int dr = -1; dr <= 1; dr++)
    for(int dc = -1; dc <= 1; dc++)
      if(dr != 0 || dc != 0) dfs(r+dr, c+dc, id);
}

int main() {
  while(scanf("%d%d", &m, &n) == 2 && m && n) {
    for(int i = 0; i < m; i++) scanf("%s", pic[i]);
    memset(idx, 0, sizeof(idx));
    int cnt = 0;
    for(int i = 0; i < m; i++)
      for(int j = 0; j < n; j++)
        if(idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt);
    printf("%d\n", cnt);
  }
  return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yvonnae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值