zoukankan      html  css  js  c++  java
  • 【poj 2386】Lake Counting

    Description

    Due to recent rains, water has pooled in various places in Farmer John's field, which is represented by a rectangle of N x M (1 <= N <= 100; 1 <= M <= 100) squares. Each square contains either water ('W') or dry land ('.'). Farmer John would like to figure out how many ponds have formed in his field. A pond is a connected set of squares with water in them, where a square is considered adjacent to all eight of its neighbors.

    Given a diagram of Farmer John's field, determine how many ponds he has.

    Input

    * Line 1: Two space-separated integers: N and M

    * Lines 2..N+1: M characters per line representing one row of Farmer John's field. Each character is either 'W' or '.'. The characters do not have spaces between them.

    Output

    * Line 1: The number of ponds in Farmer John's field.

    Sample Input

    10 12
    W........WW.
    .WWW.....WWW
    ....WW...WW.
    .........WW.
    .........W..
    ..W......W..
    .W.W.....WW.
    W.W.W.....W.
    .W.W......W.
    ..W.......W.

    Sample Output

    3

    Hint

    OUTPUT DETAILS:

    There are three ponds: one in the upper left, one in the lower left,and one along the right side.
    题意
    求八连通块,如下:
    .  .  .
    . W .
    .  .  .
    题解
    从任意的W开始,不停地把邻接的部分用'.'代替。1次DFS后与初始的这个W连接的所有W就都被替换成了'.',
    因此直到图中不再存在W为止,总共进行DFS的次数就是答案了。8个方向共对应了8种状态转移,每个格子作为DFS的参数至多被调用一次,所以复杂度为O(8*N*M)=O(N*M)。
     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<iostream>
     5 using namespace std;
     6 int n,m;char map[105][105];
     7 void dfs(int i,int j){
     8     map[i][j]='.';
     9     for(int dx=-1;dx<=1;dx++)
    10         for(int dy=-1;dy<=1;dy++){
    11             int nx=i+dx,ny=j+dy;
    12             if(nx>=0&&nx<n&&ny>=0&&ny<m&&map[nx][ny]=='W') dfs(nx,ny);
    13         }
    14     return ;
    15 }
    16 int main(){
    17     ios::sync_with_stdio(false);
    18     cin>>n>>m;
    19     for(int i=0;i<n;i++) for(int j=0;j<m;j++) cin>>map[i][j];
    20     int ans=0;
    21     for(int i=0;i<n;i++)
    22         for(int j=0;j<m;j++){
    23             if(map[i][j]=='W'){
    24                 dfs(i,j);
    25                 ans++;
    26             }
    27         }
    28     printf("%d
    ",ans);
    29 }
  • 相关阅读:
    WPF 调用WINForm中的ColorDialog
    WPF 获取ControlTemplate 中的控件方法
    <转> 8个超棒的免费高质量图标搜索引擎
    WPF 右键菜单动画
    WPF 创建超级连接
    WPF 数据模板的切换简单事例
    WPF 关于ShowDialog后主窗体依然能响应键盘输入法的解决方案。
    <转>强制类型转换总结
    WPF 中的MessageBox返回值获取并判断
    WPF数据绑定实现自定义数据源
  • 原文地址:https://www.cnblogs.com/Emine/p/7591083.html
Copyright © 2011-2022 走看看