hdu 1241

来源:互联网 发布:淘宝网老版本下载安装 编辑:程序博客网 时间:2024/06/07 12:54

问题描述

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


输入

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


输出

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


样例输入

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


样例输出

0122


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

这道题是标准的图论搜索题,用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 0