圖形面積
題目
- 桌面上放了N個平行於座標軸的矩形,這N個矩形可能有互相覆蓋的部分,求它們組成的圖形的面積。
輸入
- 輸入第一行爲一個數N(1≤N≤100),表示矩形的數量。下面N行,每行四個整數,分別表示每個矩形的左下角和右上角的座標,座標範圍爲–108到108之間的整數。
輸出
- 輸出只有一行,一個整數,表示圖形的面積。
輸入樣例
3
1 1 4 3
2 -1 3 2
4 0 5 2
輸出樣例
10
解題思路
其實這道題就是一道離散化,把每個矩形的邊給壓縮,讓它變小,就可以實現離散化了.
程序如下
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
long long n,a[10001][10],f[10001],ff[10001],ans;
int main()
{
scanf("%lld",&n);
for(int i = 1;i <= n; ++i)
{
scanf("%lld%lld%lld%lld",&a[i][1],&a[i][2],&a[i][3],&a[i][4]);
f[i*2-1] = a[i][1];//把每條邊給存入進去
ff[i*2-1] = a[i][2];
f[i*2] = a[i][3];
ff[i*2] = a[i][4];
}
sort(f + 1,f + 1 + n * 2);//邊的起始點排序
sort(ff + 1,ff + 1 + n * 2);//邊的終點排序
for(int i = 1;i <= n * 2 - 1; ++i)//枚舉橫座標
{
for(int j = 1;j <= n * 2 - 1;++j)//枚舉縱座標
{
for(int k = 1;k <= n; ++k)
{
if(f[i] >= a[k][1] && ff[j] >= a[k][2] && f[i+1] <= a[k][3] && ff[j+1] <= a[k][4])//判斷是否可以壓縮
{
ans += (f[i+1]-f[i])*(ff[j+1]-ff[j]);//加上矩形的面積
break;
}
}
}
}
printf("%lld",ans);
return 0;
}