代码
#include <iostream>
#include <algorithm>
using namespace std;
double a[2][4]; //two points
double c[4]; //intersection
void preprocess() {
for(int i=0; i<2; i++) {
for(int j=0; j<2; j++) {
if(a[i][j]>a[i][j+2]) {
swap(a[i][j], a[i][j+2]);
}
}
}
if(a[0][0]>a[1][0]) {
swap(a[0], a[1]);
}
}
double calculate() {
c[0] = max(a[0][0], a[1][0]);
c[1] = max(a[0][1], a[1][1]);
c[2] = min(a[0][2], a[1][2]);
c[3] = min(a[0][3], a[1][3]);
double re = (c[2]-c[0]) * (c[3]-c[1]);
return re;
}
int main() {
while(cin>>a[0][0]>>a[0][1]>>a[0][2]>>a[0][3]>>a[1][0]>>a[1][1]>>a[1][2]>>a[1][3]) {
preprocess();
double ans = 0;
if(a[1][0]<a[0][2] && a[1][1]<a[0][3] && a[1][2]>a[0][0] && a[1][3]>a[0][1]) {
ans = calculate();
}
printf("%.2f\n", ans);
}
return 0;
}
注解
1、本题主要是把握好两矩形的关系。比较关键的数据预处理工作是:
(1)题目可能给出的是副对角线的数据,要先转换成主对角线。
(2)始终假定a在b左边,因此若a[0]>b[0],则要交换两矩形。
2、要计算面积,要先确定两矩形是否相交。若不相交,面积为0。否则,找两矩形交的那部分,也就是找 左下角的最大值,右上角的最小值。