zoukankan      html  css  js  c++  java
  • BFS练习-POJ.2386

    Lake Counting
    Time Limit: 1000MS Memory Limit: 65536K
    Total Submissions: 35122 Accepted: 17437
    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.

    我的理解是每一次BFS之后一个水洼就都被替换成’W’,当不存在’W’的时候,说明没有水洼了,那么BFS的次数就是水洼的数目,每个点只扫描一次。

    #include<iostream>
    #include<queue>
    #define N 110                               //比题目指定的N范围大一点
    #define M 110
    using namespace std;
    
    typedef pair<int, int> point;               //这个时候写pair比结构体要方便一点
    int res = 0;                                //符合要求的水洼数目
    char maze[N][M];                            //记录整个地图
    void BFS(int x,int y)                       
    {
        queue<point>que;                        //建立队列
        point current;                          //记录当前的点的信息
        int i, j, dx, dy, dir_1, dir_2;
        for (i = 0; i < x; i++)
        {
            for (j = 0; j < y; j++)
            {
                if (maze[i][j] == 'W')          //如果当前这个点是积水
                {
                    que.push(point(i,j));       //就加入队列
                    maze[i][j] = '.';           //标记已经搜索过了这个点
                    while (!que.empty())        //判断队列是否为空
                    {
                        current = que.front();  //取出队首元素
                        que.pop();              //弹出第一个元素,不返回
                        for (dir_1 = -1; dir_1 <= 1; dir_1++)           //8个方向的遍历
                        {
                            for (dir_2 = -1; dir_2 <= 1; dir_2++)
                            {
                                dx = current.first + dir_1, dy = current.second + dir_2;            //坐标的变化
                                if (dx >= 0 && dx < x&&dy >= 0 && dy < y&&maze[dx][dy] != '.')      //判断是否这个点合法
                                {   
                                    que.push(point(dx, dy));                                        //合法则加入队列
                                    maze[dx][dy] = '.';                                             //标记这个点已经搜索过了
                                }
                            }
                        }
                    }
                    res++;                                                                          //水洼数目+1
                }
            }
        }
    }
    
    void solve()
    {
        int k = 0, x, y;
        cin >> x >> y;
        for (k = 0; k < x; k++)
        {
            cin >> maze[k];
        }
        BFS(x,y);
        cout << res << endl;
    }
    int main(void)
    {
        solve();
        return 0;
    }
  • 相关阅读:
    R
    R 包的安装,使用,更新
    R 安装 简单实用
    R 介绍
    mongo:用户管理
    MySQL 书籍
    mongo: 索引
    blog
    游标处理
    如何在ASP.NET的web.config配置文件中添加MIME类型
  • 原文地址:https://www.cnblogs.com/FlyerBird/p/9052582.html
Copyright © 2011-2022 走看看