(新版)SJTU-OJ-1213. 雨后水塘

该博客介绍了一道关于计算田地中水塘数量的编程题。题目中,田地由‘W’(水)和‘.’(陆地)组成,水塘是由连通的水组成的区域。通过广度优先搜索(BFS)遍历田地,标记并消除已访问的水单元,最终计算出水塘的个数。提供的代码实现了这一算法,并给出了样例输入和输出。
摘要由CSDN通过智能技术生成

题目描述

由于最近下雨,田地里各处积水,田地有 N × M (1 <= N <= 100;1 <= M <= 100)平方。每个平方要么包含水(‘W’),要么包含陆地(’.’)。计算出田地里有多少水塘。水塘是一组有水的连通的土地,其中每个平方被认为与它的所有八个邻居相邻(即包括斜方位)。

给出一张图,确定有多少个水塘。

输入格式

第 1 行:两个正整数 N 和 M,表示田地的长和宽。 第 2 行到第 N+1 行:每行M个字符代表一排田地。每个字符可以是’W’或’.’。字符之间没有空格。

输出格式

第1行:水塘个数

样例输入

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

数据范围

1 <= N <= 100
1 <= M <= 100

题目彩蛋

       你有没有发现这个出题的助教似乎不会 Latex

题目解答

       真的是实力水题,你值得拥有!直接把之前的 (新版)SJTU-OJ-1030. 二哥的地图 相关的数据修改了一下,注意 要修改的是 dx dy 的数组,因为本题是八个方向,那就是,然后注意字符串的读取,还有 bfs 的里面的for 循环要修改一下个数!

int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};

       完整代码AC如下:

#include <iostream>
#include <queue>
using namespace std;

int m, n;
bool testmap[510][510];     // true表示池塘。
int dx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
int dy[8] = {1, -1, 0, 0, 1, -1, -1, 1};

class node
{
    public:
        int x;
        int y;
};

bool bfs_CheckNextstep(node checkobject)
{
    if (checkobject.x < 0 || checkobject.x >= n)
        return false;
    if (checkobject.y < 0 || checkobject.y >= m)
        return false;
    if (testmap[checkobject.x][checkobject.y] == false)
        return false;
    else
        return true;
}


void bfs_CheckSurrounding(node Place_Checked)
{
    queue<node> bfsque;
    bfsque.push(Place_Checked);
    node currentplace, nextplace;
    while (!bfsque.empty())
    {
        currentplace = bfsque.front();
        bfsque.pop(); // 把最前面的元素弹出去!
        for (int i = 0; i < 8; i++)
        {
            nextplace.x = currentplace.x + dx[i];
            nextplace.y = currentplace.y + dy[i];
            if (bfs_CheckNextstep(nextplace) == true)
            {
                testmap[nextplace.x][nextplace.y] = false;
                bfsque.push(nextplace);
            }
        }
    }
}   

int main()
{
    char tempcin;
    int ans = 0;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> tempcin;
            if (tempcin == 'W')
            {
                testmap[i][j] = true;
            }
            else 
            {
                testmap[i][j] = false;
            }
        }
    }

    node temp;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (testmap[i][j] == true)
            {
                ans++;
                temp.x = i;
                temp.y = j;
                bfs_CheckSurrounding(temp);
            }
        }
    }

    cout << ans;
    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值