题目大意:有一块m*n油田,’@‘认为是有油,’*‘认为没油,如果有多块油田连着,则被统一认为为一块油田,一块油田可以有上,下,左,右,左上,右上,左下,右下8个方位,问一共有多少块油田。
思路分析:从(0,0)点开始找,遇到一个油田’@‘,调用dfs函数,搜索以这个点为根节点的一整棵树,并把这个过程中的被找到的结点对应的油田的位置设为’*‘,即没油,保证这个点只被访问一次。一直找到(m-1,n-1)调用了多少次dfs,就说明有多少个油田,在此计数就可以了。
#include<stdio.h>
#include<string.h>
const int maxn=110;
char oil[maxn][maxn];
int dir[8][2]={-1,-1,-1,0,-1,1,0,-1,0,1,1,-1,1,0,1,1};
int m,n,count;
void dfs(int x,int y){
if(oil[x][y]=='*'||x<0||x>=m||y<0||y>=n)
return;
oil[x][y]='*';
for(int i=0;i<8;i++){
dfs(x+dir[i][0],y+dir[i][1]);
}
}
int main(){
while(~scanf("%d%d",&m,&n),m){
count=0;
for(int i=0;i<m;i++){
scanf("%s",oil[i]);
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(oil[i][j]=='@'){
dfs(i,j);
count++;
}
}
}
printf("%d\n",count);
}
return 0;
}