蓝桥杯:积木(C++)【模拟】

该博客介绍了一个关于小明用积木搭建城堡的游戏,其中涉及到将积木层数表示为二维矩阵的问题。文章描述了格格巫通过魔法水淹城堡的情景,并给出了不同水位下被淹没积木的数量。解题思路包括逐个扫描并更新积木层数,以计算不同水深下的淹没积木计数。提供的代码实现了这一模拟过程。

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

原题:

【问题描述】
小明用积木搭了一个城堡。
为了方便,小明在搭的时候用的是一样大小的正方体积本,搭在了一个 n 行 m 列的方格图上,每个积木正好占据方格图的一个小方格。
当然,小明的城堡并不是平面的,而是立体的。明可以将积木垒在别的积木上面。当一个方格上的积木垒得比较高时,
小就是一个高塔,当一个方格上没有积木时,就是一块平地。
小明的城堡可以用每个方格上垒的积木层数来表示。例如,下面就表示一个城堡。
9 3 3 1
3 3 3 0
0 0 0 0
这个城堡南面和东面都有空地,西北面有一个大房子,在西北角还有一个高塔,东北角有一个车库。
现在,格格巫要来破坏小明的城堡,他施了魔法水淹小明的城堡。
如果水的高度为1,则紧贴地面的那些积木要被水淹,在上面的例子中,有7块积木要被水淹。
如果水的高度为2,则更多积木要被水淹,在上面的例子中,有13块积木要被水淹。
给定小明的城堡图,请问,水的高度依次为1, 2, 3, …, H 时,有多少块积木要被水淹。

【输入格式】
输入的第一行包含两个整数 n, m。
接下来 n 行,每行 m 个整数,表示小明的城堡中每个位置积木的层数。
接下来包含一个整数 H,表示水高度的上限。
【输出格式】
输出 H 行,每行一个整数。第 i 的整数表示水的高度为 i 时被水淹的积木数量。
【样例输入】
3 4
9 3 3 1
3 3 3 0
0 0 0 0
10
【样例输出】
7
13
19
20
21
22
23
24
25
25
【评测用例规模与约定】
对于 40% 的评测用例,1 <= n, m <= 100,1 <= H <= 100, 积木层数不超过100;
对于 70% 的评测用例,1 <= n, m <= 1000,1 <= H <= 1000, 积木层数不超过1000;
对于所有评测用例, 1 <= n, m <= 1000,1 <= H <= 100000,积木层数不超过1000000000。

解题思路:

从(1,1)到(n,m)逐个扫描,每次扫描到大于0的积木数位置就记录淹没一次,同时让当前位置积木数减一,直到扫描h次。

代码实现:

#include <iostream>
using namespace std;
int n, m, h, sum = 0;
int s[1000][1000];

void simulation()
{
    static int tempSum = -1;
    if(tempSum == 0)   // 如果上一次被淹没是积木数为0,则之后无论水位如何上升都无法淹没更多的积木
        return;
    tempSum = 0;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
        {
            if(s[i][j] > 0)
            {
                --s[i][j];
                ++tempSum;
            }
        }
    }
    sum += tempSum;
}

int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < m; ++j)
            cin >> s[i][j];
    }
    cin >> h;
    for (int i = 0; i < h; ++i)
    {
        simulation();
        cout << sum << endl;
    }
    return 
}

测试输入:

3 4
9 3 3 1
3 3 3 0
0 0 0 0
10

运行结果:

7
13
19
20
21
22
23
24
25
25
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值