题目描述:
GeoSurvComp地质探测公司负责探测地下油田。每次GeoSurvComp公司都是在一块长方形的土地上来探测油田。在探测时,他们把这块土地用网格分成若干个小块,然后逐个分析每块土地,用探测设备探测地下是否有油田。土地底下有油田则成为pocket,如果两个pocket相邻,则认为是同一块油田,油田可能覆盖多个pocket。试计算长方形的土地上有多少个不同的油田。
输入描述:
输入文件中包含多个测试数据,每个测试数据描述了一个网格。每个网格数据的第1行为两个整数:m、n,分别表示网格的行和列;如果m=0,则表示输入结束,否则1<=m<=100,1<=n<=100。接下来有m行数据,每行数据有n个字符(不包括行结束符)。每个字符代表一个小方块,如果为“*”,则代表没有石油,如果为“@”,则代表有石油,是一个pocket。
输出描述:
对输入文件中的每个网格,输出网格中不同的油田数目。如果两块不同的pocket在水平、垂直或者对角线方向上相邻,则被认为属于同一块油田。每块油田所包含的pocket数目不会超过100。
样例输入输出:
思路:从行列对角线方向为同一个油田可以得知设定方向数组
int next[8][2]={{-1,-1},
{0,-1},
{1,-1},
{-1,0},
{1,0},
{-1,1},
{0,1},
{1,1}};
分别代表八个走向。
整体思路为:遍历每一个坐标点,如果是@则进行搜索,搜索直到非油田也就是 * 结束,ans++;搜索到的标记为 非油田 “*”
挨个点进行遍历
参考别的大佬后修改的ac代码
#include<stdio.h>
char a[150][150];
int m,n;
int tx,ty;//下一个的坐标点
int next[8][2]={{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}};//八方向数组
void dfs(int x,int y){
a[x][y] = '*';//遍历过后标记成 *
for(int k=0;k<8;k++){
tx = x+next[k][0];
ty = y+next[k][1];
if(tx<0 || ty<0 || tx>=m || ty>=n)
continue;//判断越界,越界了就继续换个方向走
if(a[tx][ty]=='@')
dfs(tx,ty);//如果是油田继续给爷搜
}
}
int main(){
while(1){
scanf("%d %d",&m,&n);
if(m==0) break; //结束
for(int i = 0;i<m;i++){
scanf("%s",a[i]);//原来还可以这么输入
}
int ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(a[i][j] == '@'){//(起始搜索点)如果是油田的话开始搜
dfs(i,j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}