DFS专题 POJ2386
题目:
由于最近下雨,水在农民约翰的田里的各个地方汇集起来,用一个N×M(1<=N<=100;1<=M<=100)正方形表示。每一个正方形包含水(“W”)或旱地(“.”)。农场主约翰想弄清楚他的田里有多少池塘。池塘是一组有水的相连的正方形,其中一个正方形被认为与它的八个邻居相邻。给一张农夫约翰的田地图,确定他有多少池塘。
思路:
讲真我不知道这题想表达是什么
这题是求连通块的个数。
小技巧:
八方向如何表示
for(int dx=-1;dx<=1;dx++)
for(int dy=-1;dy<=1;dy++)
int nx=i+dx,ny=j+dy;//i,j 为坐标
AC代码:
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int N=110; char mp[N][N]; int n,m; void dfs(int i,int j) { mp[i][j]='.'; for(int dx=-1;dx<=1;dx++) for(int dy=-1;dy<=1;dy++) { int nx=i+dx,ny=j+dy; if(nx>=0&&nx<n&&ny>=0&&ny<m&&mp[nx][ny]=='W') dfs(nx,ny); } return ; } int main() { int res=0; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>mp[i][j]; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(mp[i][j]=='W') { dfs(i,j); res++; } } cout<<res<<endl; return 0; }

浙公网安备 33010602011771号