题目链接:http://poj.org/problem?id=1562
题目大意:翻译看的《图论算法理论,实现及应用》王桂平著 ,例2.2
思路:简单的搜索题,遍历每一个点,如果是@则以这个点为起点做一次dfs,把dfs过程中遇到的点都标记为*,没做一次dfs就是num++,这样最后的num就是油田的个数。
///2014.7.25
///poj1562,zoj1709
//Accepted 672K 0MS G++ 939B 2014-07-25 21:01:18
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,m;
int num;
char maze[110][110];
const int dir[8][2] = { {0,1},{1,0},{0,-1},{-1,0},{-1,1},{1,1},{1,-1},{-1,-1} };
void init(){
num = 0;
for(int i=0 ; i<n ; i++)
scanf("%s",maze[i]);
}
void dfs(int x,int y){
maze[x][y] = '*';
int xx,yy;
for(int i=0 ; i<8 ; i++){
xx = x + dir[i][0];
yy = y + dir[i][1];
if( xx>=0 && xx<n && yy>=0 && yy<m && maze[xx][yy]=='@' )
dfs(xx,yy);
}
}
int main(){
while( scanf("%d %d",&n,&m) && n ){
init();
for(int i=0 ; i<n ; i++){
for(int j=0 ; j<m ; j++){
if( maze[i][j]=='@' ){
num ++;
dfs(i,j);
}
}
}
printf("%d\n",num);
}
return 0;
}