【離散化】圖形面積

圖形面積

題目

  • 桌面上放了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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章