Oil Deposits

Description
The GeoSurvComp geologic survey company is for detecting underground oil deposits. GeoSurvComp works
 with one large rectangular region of land at a time, creates a grid that divides the land into numerous square
 plots. It then analyzes each plot separately, using equipment to determine whether or not the plot contains oil.

 A plot containing oil is called a pocket. If two pockets adjacent, then they are part of the same oil deposit.   Oil 

deposits can be quite large and may contain numerous  Your job is to determine how many different oil deposits 

are contained in a grid. 


input


The input file contains one or more grids. Each grid begins with a line containing m and n, the number of rows and 

columns in the grid, separated by a single space. If m = 0 it signals the end of the input; otherwise 1 <= m <= 100 

and 1 <= n <= 100.Following this are m lines of n characters each (not counting the end-of-line characters). Each 

character corresponds to one plot, and is either `*', representing the absence of oil, or `@',representing an oil pocket. 


Output

For each grid, output the number of distinct oil deposits. Two different pockets are part of the same oil deposit if they 

are adjacent horizontally, vertically, or diagonally. An oil deposit will not contain more than 100 pockets. 


Sample Input


1 1

*


3  5


*@*@*
* *@* *
*@*@*


1 8

@@****@*


5 5  
*   *   *    *  @
*  @ @  *  @
*  @  *    *  @
@@@   *  @
@@  *   *  @

0 0 


Sample Output
0
1
2

2

题意:题目的意思就是统计字符“@”组成了多少个八连块。如果两个字符“@”所在的格子相邻(横,竖或者对角线方向),就说他是同一个把连块。列如 输入的 5 5

有两个八连块,(注:从整体来看)。

通俗点讲就是:如果有单个的@的,则算是一个,但是对于@连着的,就只算是一个,问有多少个,就可以知道了,

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
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)&& 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值