【每日例题】蓝桥杯 c++ 清理水域

发布时间 2023-10-26 20:50:30作者: 山远尽成云

清理水域

题目

问题描述
小蓝有一个n ×m大小的矩形水域,小蓝将这个水域划分为n行m列,行数从1到n标号,列数从1到m标号。每行和每列的宽度都是单位1。
现在,这个水域长满了水草,小蓝要清理水草。
每次,小蓝可以清理—块矩形的区域,从第r1行(含)到第r2行(含)的第c1列(含)到c2列(含)。
经过—段时间清理后,请问还有多少地方没有被清理过。
输入格式
输入第一行包含两个整数n, m,用一个空格分隔
第二行包含—个整数t,表示清理的次数。
接下来t行,每行四个整数r1, c1,r2,c2,相邻整数之间用一个空格分隔,表示—次清理。请注意输入的顺序。
输出格式
输出—行包含—个整数,表示没有被清理过的面积。

样例输入
2 3

2
1 1 1 3

1 2 2 2
样例输出

2
样例输入
30 20
2
5 5 10 15
6 7 15 9
样例输出
519

蓝桥杯 清理水域

思路分析

  1. 这一题重点是需要处理好已清理水域,未清理水域,重复清理水域的关系。由于不止处理一次水域,就会产生重复清理的区域,这样就会导致算出来的答案比真实答案少。
  2. 如何解决重复清理的水域呢?我们需要将整个水域看为一个二维数组,当二维数组全部赋予0时,我们便认为这是未处理水域,所以我们可以直接将清理的水域赋值为1,到后面只需要统计1的个数,便可以得出已经清理的水域有多少。
  3. 记住,题目要的答案是未清理的水域。

代码

#include <iostream>
using namespace std;
int main()
{
    int x[100][100]={0};
    int n,m;
    int count;
    int sum=0;
    cin>>n>>m;
    cin>>count;
    int r1,c1,r2,c2;
    for(int i=0;i<count;i++)
    {
        cin>>r1>>c1>>r2>>c2;
        for(int i=r1;i<=r2;i++)
        {
            for(int j=c1;j<=c2;j++)
            {
                x[i-1][j-1]=1;
            }
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            if(x[i][j]==1)
            {
                sum++;
            }
        }
    }
    cout<<(n*m-sum);
    return 0;
}