XDOJ——分割蜂巢

文章描述了一个关于M*N的二维数组表示的蜂巢问题,其中P表示污染区域,C表示干净区域。目标是找出污染后的干净部分被分割成的连通区域数量。作者提供了递归函数实现的深度优先搜索算法来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述 有一个 M*N 的蜂巢,用 M*N 大小的 char 二维数组(每行都是 N 列)表示。字符只能 是’C’(Clean,干净的蜂巢)或者’P’(Pollution, 污染的蜂巢),不存在其他字串输入。 如下图,沿着左上角第一个正六边形右下边拓展 N 列,正下边拓展 M 行,现在被油污 污染了一部分,求将被污染的部分切除后,剩余的干净部分被分割成了几片?问题描述 有一个 M*N 的蜂巢,用 M*N 大小的 char 二维数组(每行都是 N 列)表示。字符只能 是’C’(Clean,干净的蜂巢)或者’P’(Pollution, 污染的蜂巢),不存在其他字串输入。 如下图,沿着左上角第一个正六边形右下边拓展 N 列,正下边拓展 M 行,现在被油污 污染了一部分,求将被污染的部分切除后,剩余的干净部分被分割成了几片?

输入格式 M N 蜂巢第一行被污染的情况 … 蜂巢第 M 行被污染的情况 输出格式 整数(代表剩余的干净蜂巢有几片) 样例输入 2 3 P P C C P C 样例输出 2 样例说明 如上图蜂巢,有两行三列。 切割了被污染的蜂巢后,干净的蜂巢还有两片。 评测用例规模与约定 取值范围 0输入格式 M N 蜂巢第一行被污染的情况 … 蜂巢第 M 行被污染的情况 输出格式 整数(代表剩余的干净蜂巢有几片)

样例输入:

2

3

P P C

C P C

样例输出 2

样例说明 如上图蜂巢,有两行三列。 切割了被污染的蜂巢后,干净的蜂巢还有两片。 评测用例规模与约定 取值范围 0

源代码:

#include <stdio.h>

void pollute(char a[100][100], int m, int n, int i, int j)
{
    if (a[i][j] == 'P')
    {
        return;
    }
    else
    {
        a[i][j] = 'P';
    }
    for (int k = -1; k <= 1; k++)
    {
        for (int l = -1; l <= 1; l++)
        {
            if ((i + k >= 0 && i + k < m) && (j + l >= 0 && j + l < n) && k * l != 1)
            {
                pollute(a, m, n, i+k, j+l);//不断递归
            }
        }
    }
}
int main()
{
    int m, n;
    char a[100][100];
    scanf("%d", &m);
    scanf("%d", &n);
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf(" %c", &a[i][j]);
        }
    }

    int sum = 0; // 计算没被污染的片数
    for (int i = 0; i < m; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (a[i][j] == 'C')
            {
                sum++;
                pollute(a, m, n, i, j);
            }
        }
    }

    printf("%d", sum);

    return 0;
}

思路:类似运用了深度优化搜索的方法,不断递归找到连在一起的蜂巢

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值