问题描述
Description
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
Input
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
Output
输出仅包含一个实数,为交的面积,保留到小数后两位。
Sample Input
1 1 3 3
2 2 4 4
Sample Output
1.00
算法思路
我们需要用O1_x,O2_x中找出最小的X,然后O3_x,O4_x,找出最小的X,最后在两者中找出最大的一个。数学表达式来说就是:max( min(O1.x,O2.x),min(O3.x,O4.x) )
然后Y同理
这时,我们就找到了相交矩形的最小点了
对于求相交矩形的最大点的方式就是min( max(O1.x,O2.x),max(O3.x,O4.x))
,Y坐标也同理
但是,要就面积的时候,我们首先需要判断一下,那图中的例子来说就是O2.y > O3.y,O2.x > O3.x,具体写法请看代码;
完整代码
#include <iostream>
using namespace std;
struct pos{
double x;
double y;
};
int main()
{
pos O1,O2,O3,O4;
pos mO1,mO2;
cin >> O1.x >> O1.y >> O2.x >> O2.y;
cin >> O3.x >> O3.y >> O4.x >> O4.y;
mO1.x = max(min(O1.x,O2.x),min(O3.x,O4.x));
mO1.y = max(min(O1.y,O2.y),min(O3.y,O4.y));
mO2.x = min(max(O1.x,O2.x),max(O3.x,O4.x));
mO2.y = min(max(O1.y,O2.y),max(O3.y,O4.y));
if(mO2.y > mO1.y && mO2.x > mO1.x){ // !!!这里需要注意
double ans = (mO2.y-mO1.y)*(mO2.x-mO1.x);
printf("%.2f",ans);
}else{
printf("0.00");
}
return 0;
}