zl程序教程

您现在的位置是:首页 >  其它

当前栏目

图形面积

图形 面积
2023-09-27 14:28:30 时间

图 形 面 积 图形面积

题目链接:ssl 2880

题目

桌面上放了 N N N个平行于坐标轴的矩形,这 N N N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。

输入

输入第一行为一个数 N N N,表示矩形的数量。下面 N N N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标。

输出

输出只有一行,一个整数,表示图形的面积。

样例输入

3
1 1 4 3
2 -1 3 2
4 0 5 2

样例输出

10

数据范围

1 ≤ N ≤ 100 1≤N≤100 1N100
坐标范围为 – 1 0 8 –10^8 108 1 0 8 10^8 108之间的整数。

思路

这道题我们用离散化来做。
就离散化 x x x轴和 y y y轴,然后枚举每一个离散化后的坐标,在矩阵内就加面积。
最后输出总面积,就可以了。

代码

#include<cstdio>
#include<algorithm>
#define ll long long

using namespace std;

ll n, x1[101], y1[101], x2[101], y2[101], x[201], y[201], ans, k;

int main() {
	scanf("%lld", &n);//读入
	for (ll i = 1; i <= n; i++) {
		scanf("%lld %lld %lld %lld", &x1[i], &y1[i], &x2[i], &y2[i]);//读入
		x[++k] = x1[i];//标记
		y[k] = y1[i];
		x[++k] = x2[i];
		y[k] = y2[i];
	}
	
	sort(x + 1, x + k + 1);//离散化
	unique(x + 1, x + k + 1);
	sort(y + 1, y + k + 1);
	unique(y + 1, y + k + 1);
	
	for (ll i = 1; i < k; i++)//枚举坐标
		for (ll j = 1; j < k; j++)
			for (ll l = 1; l <= n; l++)//枚举矩阵
				if (x[i] >= x1[l] && y[j] >= y1[l] && x[i + 1] <= x2[l] && y[j + 1] <= y2[l]) {//判断是否在矩阵内
					ans += (x[i + 1] - x[i]) * (y[j + 1] - y[j]);//加面积
					break;//找到了就枚举下一个坐标
				}
	
	printf("%lld", ans);//输出
	
	return 0;
}