油田 (Oil Deposits,Uva 572)

本文介绍了一个用于检测矩形土地上油藏分布的算法。通过将土地划分为多个正方形地块并使用传感设备分析每个地块是否含有石油,该算法能够确定不同油藏的数量。输入包括土地网格的大小和地块信息,输出则是独立油藏的数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

A plot containing oil is called a pocket. If two pockets are adjacent, then they are part of thesame oil deposit. Oil deposits can be quite large and may contain numerous pockets. Your job is todetermine 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 numberof 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 countingthe end-of-line characters). Each character corresponds to one plot, and is either ‘*’, representing theabsence 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 sameoil deposit if they are adjacent horizontally, vertically, or diagonally. An oil deposit will not containmore than 100 pockets.


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;
} 


转自《算法竞赛入门经典(第二版)》



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值