题目链接:
0矩形总面积 - 蓝桥云课 (lanqiao.cn)
说明:
参考文章:矩形总面积计算器:计算两个矩形的总面积,包括重叠区域_矩形r1的左下角坐标为x1, yl 、宽度为w1、高度为h1, 矩形r2的左下角坐标为x2,y2、宽-****博客
看似简单,实际如果一种一种列举情况写if-else还挺麻烦的。首先很容易看出的是,两矩形不相交的情况:
x[4]<=x[1]||x[3]>=x[2]||y[3]>=y[2]||y[4]<=y[1]
以及一者包含另一者的情况:x[3]>=x[1]&&x[4]<=x[2]&&y[3]>=y[1]&&y[4]<=y[2]、x[3]<=x[1]&&x[4]>=x[2]&&y[3]<=y[1]&&y[4]>=y[2]
但是两者相交的情况,如果要用列举出来,情况非常多,至少以下这么多种情况(黑色为R1,其他颜色为R2):
所以需要考虑找规律。
按照参考文章的思路,我们需要找到高效率确定重叠区域的方法,二维图形不好想象,首先从两条直线来考虑重叠区域:
由图可知,右边界是两条直线右边界的较小值,左边界是两条直线左边界的较大值,在两个矩形的重叠区域的x方向上也是满足的。如果没有重叠区域,那么找出的左边界将会大于右边界。
由这个方法也可以找到y方向上的上下边界,由此就可以计算出重叠区域的面积,但要判断一下区域是否存在(也就是判断边界差值是否大于0)。
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e9;
int ans = 0;
int x[5],y[5];
signed main() {
cin.tie(0);
cout.tie(0);
for(int i=1;i<5;i++){
cin>>x[i]>>y[i];
}
int s1=(y[4]-y[3])*(x[4]-x[3]),s2=(y[2]-y[1])*(x[2]-x[1]);
int l,r;
l=min(x[2],x[4])-max(x[1],x[3]) ;
r=min(y[2],y[4])-max(y[1],y[3]);
if(l>0&&r>0){
ans=s1+s2-l*r;
}
else
{
ans=s1+s2;
}
cout << ans;
return 0;
}