例题:在二维平面上,给定两个矩形,满足矩形的每条边分别和坐标轴平行,求这个两个矩形的并的面积。即它们重叠在一起的总的面积。
解题思路:
在求两个矩形并的面积之前,我们首先需要知道其是否相交,可以按照如下方式求解:并的面积 = 总面积 - 相交面积。于是问题转变成了如何求两个矩形相交的面积。
以(x1 , y1) 和 (x2 , y2)为左下顶点和右上顶点的矩形A,和以(x1’ , y1’) 和 (x2’ , y2’)为左下顶点和右上顶点的矩形B,它们有交集的条件是:max{ x1 , x1’ } < min{ x2 , x2’ }并且max{ y1 , y1’ } < min{ y2 , y2’ }。而如果相交,它们的面积也是
area = ( min{ x2 , x2’ } - max{ x1 , x1’ } ) * ( min{ y2 , y2’ } - max{ y1 , y1’ } )。
代码示例: 51nod2488
#include<cstdio>
#include<iostream>
using namespace std;
const int N = 10;
int xx1[N],xx2[N],yy1[N],yy2[N];
typedef long long ll;
ll jiao(int a,int b){
ll tx1 = max(xx1[a],xx1[b]),tx2 = min(xx2[a],xx2[b]);
ll ty1 = max(yy1[a],yy1[b]),ty2 = min(yy2[a],yy2[b]);
if( tx1 >= tx2 || ty1 >= ty2) return 0;
return (tx2-tx1)*(ty2-ty1);
}
ll area(int x){
return (xx2[x]-xx1[x])*(yy2[x]-yy1[x]);
}
int main(){
scanf("%d%d%d%d",xx1+1,yy1+1,xx2+1,yy2+1);
scanf("%d%d%d%d",xx1+2,yy1+2,xx2+2,yy2+2);
ll ans = area(1)+area(2);
ans -= jiao(1,2);
printf("%lld\n",ans);
return 0;
}