hdu 1241

问题描述

GeoSurvComp地质调查公司负责检测地下石油资源。GeoSurvComp发现一个大矩形区域的土地,并创建一个网格,将土地划分为许多块地。然后分别分析每一块土地,使用传感设备来确定是否包含石油。一块含有石油的土地被称为油地。如果相邻的油地,那么它们是同一油地的一部分。石油资源可能很大,可能包含众多的油地。你的工作是确定有多少不同的油地都包含在一个网格。


输入

输入文件包含一个或多个样例。每个样例的第一行包含m和n,网格中的行和列的数量,由一个空格隔开。如果m = 0,表示输入结束,否则1<=m,n<=100。随后是m行字符,每行字符有n列。每个字符对应一块土地,要么是“*”,表示没有石油,或“@”,代表油地


输出

对于每一个样例,输出不同的油地的数量。如果两块油地垂直,水平,倾斜着相邻,算作同一块油地。所有的油地数量不超过100个。


样例输入

 
 
1 1 * 3 5 *@*@* **@** *@*@* 1 8 @@****@* 5 5 ****@ *@@*@ *@**@ @@@*@ @@**@ 0 0


样例输出

 
 
0 1 2 2


题目是直接用有道在线翻译的,比较生硬。

这道题是标准的图论搜索题,用DFS可解


代码如下


#include<cstdio>
#include<cstring>
char a[105][105];
bool c[105][105];
int dir[8][2]={{1,1},{1,-1},{0,1},{0,-1},{-1,1},{-1,-1},{1,0},{-1,0}};
dfs(int i,int j,int m,int n)
{
	int k,di,dj;
	for(k=0;k<8;k++)
	{
		di=dir[k][0]+i;
		dj=dir[k][1]+j;
		if(di>=0&&di<m&&dj>=0&&dj<n&&a[di][dj]=='@'&&!c[di][dj])
		{
			c[di][dj]=true;
			dfs(di,dj,m,n);
		}
	}
}

int main()
{
	int m,n,i,j,num;
	while(scanf("%d %d",&m,&n)&&m&&n)
	{
		getchar();
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
				scanf("%c",&a[i][j]);
			}
			getchar();
		}
		memset(c,0,sizeof(c));
		num=0;
		for(i=0;i<m;i++)
		{
			for(j=0;j<n;j++)
			{
				if(a[i][j]=='@'&&!c[i][j])
				{
					c[i][j]=true;
					dfs(i,j,m,n);
					num++;
				}
			}
		}
		printf("%d\n",num);
	}
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值