zoukankan      html  css  js  c++  java
  • poj2386 Lake Counting

    题目http://poj.org/problem?id=2386

    有一个N*M的矩形,'W'表示积水,'.'表示干的陆地,积水在其相邻的8个方向上如果有其它积水,那么认为这些积水是连通的,现在需要判断这块矩形中有多少块这样完全连同的积水。

    输入样例

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

    输出样例:

    3

    思路

    • 使用dfs判断联通块的数目,注意需要将访问过的格点做标记(这里直接将'W'的格子替换为'.'即可)。

    • 使用getchar()接收输入,注意输入是否正确接收。

    代码

    #include <iostream>
    using namespace std;
    const int N = 100;
    int n, m;
    char field[N][N];
    const int raw[] = {0, 0, 1, -1, 1, 1, -1, -1};
    const int col[] = {1, -1, 0, 0, 1, -1, -1, 1};
    
    void dfs(int i, int j){
        field[i][j] = '.';
        for(int k = 0; k < 8; ++k){
            if(i+col[k]>=0 && i+col[k]<n && j+raw[k]>=0 && j+raw[k]<m && field[i+col[k]][j+raw[k]] == 'W'){
                dfs(i+col[k], j+raw[k]);
            }
        }
    }
    
    int main(){
        //freopen("input.txt", "r", stdin);
        //freopen("output.txt", "w", stdout);
        scanf("%d%d", &n, &m);
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j){
                char c; while((c = getchar()) == '
    '); // 跳过空格
                field[i][j] = c;
            }
        
       int cnt = 0;
       for(int i = 0; i < n; ++i){
           for(int j = 0; j < m; ++j){
               if(field[i][j] == 'W'){
                   dfs(i, j);
                   ++cnt;
               }
           }
       }
        printf("%d", cnt);    
    }
    
  • 相关阅读:
    linux编程:删除文件夹下的空文件
    设置vim的显示颜色
    LVM的实现流程
    LVM(逻辑卷管理器)原理
    Ext2文件的访问与日志文件系统
    Linux系统的Ext2文件系统
    linux 磁盘分区的理解
    postgresql在Linux下的安装
    内存泄漏工具VLD
    关于 正交投影 与 透视投影
  • 原文地址:https://www.cnblogs.com/patrolli/p/12188641.html
Copyright © 2011-2022 走看看