POJ 2386 Lake Count 简单的递归深搜

来源:互联网 发布:手机标尺软件 编辑:程序博客网 时间:2024/05/20 21:59

【题意】:有一个N*M的园子,雨后积水,八联通的积水被认为是连接在一起的。请求出园子里共有多少水洼?


【题意分析】:此题不难,一看便知是简单的搜索。我们可以从任意的W开始,不停的把邻接部分用' . '代替。一次DFS后与初始的这个W连接的所有W就都被替换成了' . ',因此知道图中不再存在W为止,一共进行的DFS次数就是正解!

八个方向对应八种状态转移,每个格子作为DFS的参数之多被调用一次,所以复杂度为O(8*N*M)=O(N*M)。


【遭遇问题】:自己一定要细心些,像这种水题,更要细心!找了好久的错误,原来是大写W,怪不得结果一直是0!

/* 496k  16ms */ #include<iostream>#include<cstdio>using namespace std;int n,m;char s[101][101];void dfs(int x,int y){s[x][y] ='.';//这样便能遍历八个方向 for(int dx=-1;dx<=1;dx++)for(int dy=-1;dy<=1;dy++){int nx=x+dx;int ny=y+dy;//注意临界条件 if(0<=nx && nx<=n && 0<=ny && ny<=m && s[nx][ny] == 'W'){//W大写!! dfs(nx,ny);    }}return;}int main(){int i,j,result=0;scanf("%d%d",&n,&m); for(i = 0;i<n;i++)for(j=0;j<m;j++){cin>>s[i][j];//此处如果用scanf("%s",s[i][j]),程序会停止,找出原因! }for(i=0;i<n;i++)for(j=0;j<m;j++){if(s[i][j] == 'W')//注意此W是大写!{dfs(i,j);result++;}}printf("%d\n",result);return 0;}


0 0
原创粉丝点击