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
    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

    题意:

      W表示水洼;.表示空地,八个方向连起来的水洼也算是一个,问有多少水洼。

    思路:

      简单的搜索题目,这里用深搜实现。

    代码:

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    char map[1000][1000];//用来存储图的信息
    
    /*标记是否搜索过,本题目没有使用,因为是一次访问,直接将访问过的修改即可*/
    int logo[1000][1000];
    
    int m,n,sum;
    
    /*表示八个方向,四个方向时,将后面四组删掉就可以了*/
    int dir[8][2]= {0,1, 0,-1, 1,0, -1,0, 1,1, 1,-1, -1,1, -1,-1};
    
    void DFS(int x,int y)
    {
        if(x>=0&&y>=0&&x<n&&y<m)//这里是判断是否越界,根据题目要求改写
        {
            if(map[x][y]=='W')//如果符合条件就继续递归。
            {
                map[x][y]='.';//标记为‘.’防止多次访问
                for(int i=0; i<8; i++)//因为八个方向,所以循环八次。
                    DFS(x+dir[i][0],y+dir[i][1]);
            }
        }
    }
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            sum=0;
            memset(logo,0,sizeof(map));
            getchar();
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                {
                    cin>>map[i][j];
                }
                getchar();
            }
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<m; j++)
                    if(map[i][j]=='W')
                    {
                        DFS(i,j);
                        sum++;//计数
                    }
            }
            cout<<sum<<endl;
        }
    }
  • 相关阅读:
    FPGrowth 实现
    数据库事务的4个特性ACID
    redis简介(keeper实时报表的基本部分)
    HADOOP中的CRC数据校验文件
    潜在语义分析
    AdaBoost 算法
    cocosBuilder生成cbbi文件,绑定到cocos2d-x
    C++继承模型
    Android应用经典主界面框架之中的一个:仿QQ (使用Fragment, 附源代码)
    从今天開始学习iOS开发(iOS 7版)--实现一款App之Foundation框架的使用
  • 原文地址:https://www.cnblogs.com/aiguona/p/7269196.html
Copyright © 2011-2022 走看看