问题描述
小蓝有一个 n \times mn×m 大小的矩形水域,小蓝将这个水域划分为 nn 行 mm 列,行数从 11 到 nn 标号,列数从 11 到 mm 标号。每行和每列的宽度都是单位 11 。
现在,这个水域长满了水草,小蓝要清理水草。
每次,小蓝可以清理一块矩形的区域,从第 r1r1 行(含)到第 r2r2 行(含)的第 c1c1 列(含)到 c2c2 列(含)。
经过一段时间清理后,请问还有多少地方没有被清理过。
输入格式
输入第一行包含两个整数 n, mn,m,用一个空格分隔
第二行包含一个整数 tt ,表示清理的次数。
接下来 tt 行,每行四个整数 r1, c1, r2, c2r1,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,则没清理过的为0,最后累加得出1的数量即可。
代码如下
#include<bits/stdc++.h>
using namespace std;
int a[100][100];
int main(){
int n, m, t, r1, c1, r2, c2, i, j, x, y;
scanf("%d %d", &n, &m);
scanf("%d", &t);
for(i=0;i<t;i++){
scanf("%d %d %d %d", &r1, &c1, &r2, &c2);
for(x=r1-1;x<r2;x++){
for(y=c1-1;y<c2;y++){
a[x][y]=1;//寻找清理过的区域,设置为1
}
}
}
int count=0;
for(i=0;i<n;i++){
for(j=0;j<m;j++){
//printf("%d ", a[i][j]);
if(a[i][j]==0){
count++;//累加得出未清理过的区域数量
}
}
//printf("\n");
}
printf("%d", count);
return 0;
}