【每日例题】蓝桥杯 c++ 清理水域
清理水域
题目
问题描述
小蓝有一个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
思路分析
- 这一题重点是需要处理好已清理水域,未清理水域,重复清理水域的关系。由于不止处理一次水域,就会产生重复清理的区域,这样就会导致算出来的答案比真实答案少。
- 如何解决重复清理的水域呢?我们需要将整个水域看为一个二维数组,当二维数组全部赋予0时,我们便认为这是未处理水域,所以我们可以直接将清理的水域赋值为1,到后面只需要统计1的个数,便可以得出已经清理的水域有多少。
- 记住,题目要的答案是未清理的水域。
代码
#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;
}

浙公网安备 33010602011771号