BFS练习-POJ.2386

2019-02-21 17:40:19 浏览数 (1)

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的次数就是水洼的数目,每个点只扫描一次。

代码语言:javascript复制
#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;
}

0 人点赞