问题链接:Problem G
问题简述:
有一块油田,*代表无油区,@代表油田,若油田的八个邻格内也有一块油田,则称两块油田是一块连通的油区,视作一片油区。求油区的个数。
问题分析:
连通问题,可用DFS搜索,每次DFS过去将@置为*,遍历整幅图,DFS的次数即为油区的个数
AC通过的C语言程序如下:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<queue>
#include<set>
#include<cstring>
#include<cmath>
using namespace std;
char map[105][105];
int dir[8][2]={0,1,0,-1,1,0,-1,0,1,1,1,-1,-1,1,-1,-1};
int n,m;
bool edge(int x,int y){
if(x>=0&&y>=0&&x<m&&y<n&&map[x][y]=='@'){
return 1;
}
else
return 0;
}
int DFS(int x,int y){
map[x][y]='*';
for(int i=0;i<8;i++){
int next_x=x+dir[i][0];
int next_y=y+dir[i][1];
if(edge(next_x,next_y)){
DFS(next_x,next_y);
}
}
}
int main(){
std::ios::sync_with_stdio(false);
while(cin>>m>>n){
if(m==0&&n==0){
break;
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
cin>>map[i][j];
}
}
int ans=0;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(map[i][j]=='@'){
DFS(i,j);
ans++;
}
}
}
cout<<ans<<endl;
}
}