本题思考
最开始我是分情况讨论各种相交的情况,发现判断语句写的非常繁琐,容易漏掉情况。其实这道题最简单的做法是:
(1)找出不相交的通用判断方法
当一个矩形的横(纵)坐标的最大值小于另一矩形横(纵)坐标的最小值时,不相交
(2)找出相交情况面积的通用计算方法
相交的形状是个长方形,因此只需要计算长和宽。计算长:将四个横坐标升序排序,第三个减去第二个;同样的方法计算宽。
完成上面两步,我们的编程逻辑就会变得非常清晰,一个if/else判断语句即可实现。
问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
样例输出
1.00
程序清单:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
double x[4],y[4];
//依次输入矩形坐标
cin>>x[0]>>y[0]>>x[1]>>y[1]>>x[2]>>y[2]>>x[3]>>y[3];
//判断不相交条件
if(max(x[0],x[1])<=min(x[2],x[3])||max(x[2],x[3])<=min(x[0],x[1])||max(y[0],y[1])<=min(y[2],y[3])||max(y[2],y[3])<=min(y[0],y[1]))
cout<<"0.00";//不相交面积为0
else{
sort(x,x+4);//升序排序
sort(y,y+4);
double length=x[2]-x[1];//中间的两个作差
double width=y[2]-y[1];
printf("%.2lf",length*width);//计算面积
}
return 0;
}
这里也提供另一种方法,原理和上面一样。
#include <iostream>
#include <algorithm>
#include <iomanip>
using namespace std;
int main()
{
double A[4]={0};
double B[4]={0};
for(int i=0;i<4;i++) //输入矩形A
cin>>A[i];
for(int i=0;i<4;i++) //输入矩形B
cin>>B[i];
double x[4]={A[0],A[2],B[0],B[2]}; //将所有的横坐标存入数组x,等待排序
double y[4]={A[1],A[3],B[1],B[3]}; //将所有的纵坐标存入数组y,等待排序
double max_Ax=max(A[0],A[2]);
double max_Ay=max(A[1],A[3]);
double max_Bx=max(B[0],B[2]);
double max_By=max(B[1],B[3]);
double min_Ax=min(A[0],A[2]);
double min_Ay=min(A[1],A[3]);
double min_Bx=min(B[0],B[2]);
double min_By=min(B[1],B[3]);
//当一个矩形横(纵)坐标的最大值小于另一矩形横(纵)坐标的最小值时,不相交。
if(max_Ax<=min_Bx||max_Ay<=min_By||max_Bx<=min_Ax||max_By<=min_Ay)
cout<<0.00<<endl;
else
{
sort(x,x+4); //将数组x按升序排列
sort(y,y+4);
double width=x[2]-x[1]; //相交面积的长
double height=y[2]-y[1]; //相交面积的
cout<<setiosflags(ios::fixed)<<setprecision(2)<<width*height<<endl;
}
return 0;
}