POJ 2386 Lake counting

来源:互联网 发布:专业泳衣知乎 编辑:程序博客网 时间:2024/05/16 05:25

本题链接可在poj 中根据题号找到

基本思路:通过深度优先遍历的方法找出所有八连通的点,即如果有一点是水,那么周围是水的点应该按深度优先遍历,并置为‘.’。按照上述的过程一直遍历,那么相连通的水集合都会被置为‘.’,但是其他不连通的点依然保持不变,因此我们需要对原始图进行一次遍历,如果有水,则按照上述的过程dfs。总之,在图上遇到几次水,说明有几个水集合。

代码如下:

#include<stdio.h>#include<iostream>using namespace std;const int N_Max=100,M_Max=100;char Lake[N_Max][M_Max];int N,M;void dfs(int n,int m){if(Lake[n][m]=='.')return;Lake[n][m]='.';for(int i=-1;i!=2;i++)for(int j=-1;j!=2;j++){if( 0<=n+i&&n+i<N && 0<=m+j&&m+j<M && Lake[n+i][m+j]=='W')dfs(n+i,m+j);}return ;}int main(){cin>>N>>M;for(int i=0;i!=N;i++)for(int j=0;j!=M;j++){cin>>Lake[i][j];}int res=0;for(int i=0;i!=N;i++)for(int j=0;j!=M;j++){if(Lake[i][j]=='W'){dfs(i,j);res++;}}printf("%d\n",res);return 0;}


0 0