当前位置: 代码迷 >> 综合 >> DFS--Oil Deposits
  详细解决方案

DFS--Oil Deposits

热度:66   发布时间:2023-12-06 06:05:14.0
GeoSurvComp地质调查公司负责检测地下石油矿床。GeoSurvComp 一次处理一个大的矩形土地区域,并创建一个网格,将土地划分为多个方形地块。然后,它分别分析每个地块,使用传感设备确定该地块是否含有石油。含有油的地块称为口袋。如果两个口袋相邻,则它们是同一油沉积物的一部分。油沉积物可能相当大,可能包含许多口袋。您的工作是确定网格中包含多少种不同的油藏。

输入

输入包含一个或多个网格。每个网格都以一条包含 m 和 n 的线开头,m 和 n 是网格中的行数和列数,由单个空格分隔。如果m = 0,则表示输入结束;否则 1 <= m <= 100 和 1 <= n <= 100。在此之后是 m 行,每行包含 n 个字符(不计算行尾字符)。每个字符对应于一个图,并且是"*",表示没有油,或"@",表示油袋。
 

输出

在水平、垂直或对角线上相邻。一个油沉积物不会包含超过100个口袋。

示例输入

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

示例输出

0
1
2
2

代码 

#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<queue>
int fx[8]={0,0,-1,1,-1,1,-1,1},fy[8]={-1,1,0,0,-1,-1,1,1};
//横坐标移动方案,对应纵坐标的移动方案
char map1[105][105];//二维图形
int n,m;//,m:行数 n:列数
bool vis[105][105];//是否访问void dfs(int x,int y)//进行搜索
{if(map1[x][y]=='@'){map1[x][y]='*';for(int i=0;i<8;i++){int a=fx[i]+x;//横坐标改变int b=fy[i]+y;//纵坐标if(map1[a][b]=='@'&&vis[a][b]==false&&a<n&&a>=0&&b<m&&b>=0)//dfs(a,b),vis[a][b]=true;}}}
int main()
{while(scanf("%d%d",&n,&m)&&n!=0&&m!=0){int sum=0;//sum:八连块的区域数getchar();memset(vis,false,sizeof(vis));//memset()针对字节操作这是将一个数组的所有分量设为flase的便捷方法for(int i=0;i<n;i++){scanf("%s",map1[i]);getchar();
/*思考》》为什么 scanf("%c",&map1[i][j]);getchar();不行而cin>>map1[i][j];可以欢迎评论区留言《《O》》*/}for(int i=0;i<n;i++)for(int j=0;j<m;j++){if(map1[i][j]=='@'&& vis[i][j]==false)//从没被搜索并且是@的地方开始深搜{vis[i][j]=true;dfs(i,j);sum++;//深搜到底后,出来使得油藏数目增加}}printf("%d\n",sum);}return 0;}