题意
Description
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
Input
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
Output
输出仅包含一个实数,为交的面积,保留到小数后两位。
Sample Input
1 1 3 3 2 2 4 4
Sample Output
1.00
code
2019-03-12 16:49:28
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
double x1,y1,x2,y2;
double xx1,yy1,xx2,yy2;
double top,down; // 所交的矩形上 下
double left,right; // 所交的矩形左 右
cin>>x1>>y1>>x2>>y2;
cin>>xx1>>yy1>>xx2>>yy2;
if(x1>=x2) // 初始化 第一个矩形 x1 y1 x2 y2 分别对应最左 最下 最右 最上
{
if(y1>=y2)
{ double t; t=x1;x1=x2;x2=t; double p; p=y1;y1=y2;y2=p; }
else
{ double t; t=x1;x1=x2;x2=t; }
}
else
{
if(y1>=y2)
{ double t; t=y1;y1=y2;y2=t; }
}
if(xx1>=xx2) // 初始化 第二个矩形 xx1 yy1 xx2 yy2 分别对应最左 最下 最右 最上
{
if(yy1>=yy2)
{ double t; t=xx1;xx1=xx2;xx2=t; double p; p=yy1;yy1=yy2;yy2=p; }
else
{ double t; t=xx1;xx1=xx2;xx2=t; }
}
else
{
if(yy1>=yy2)
{ double t; t=yy1;yy1=yy2;yy2=t; }
}
if(x1>=xx2 || xx1>=x2 || y1>=yy2 || y2<=yy1) // 两矩形分离
{
cout<<"0.00"<<endl;
}
else if( (x1>=xx1 && x2<=xx2) || (xx1>=x1 && xx2<=x2) || (y1>=yy1 && y2<=yy2) || (yy1>=y1 && yy2<=y2) )
{
if(x1<=xx1) left=xx1; // 两矩形内函
else left=x1;
if(x2<=xx2) right=x2;
else right=xx2;
if(y1<=yy1) down=yy1;
else down=y1;
if(y2<=yy2) top=y2;
else top=yy2;
printf("%.2f\n",(right-left)*(top-down));
}
else // 两矩形相交
{
if(x1<=xx1) left=xx1;
else left=x1;
if(x2<=xx2) right=x2;
else right=xx2;
if(y1<=yy1) down=yy1;
else down=y1;
if(y2<=yy2) top=y2;
else top=yy2;
printf("%.2f\n",(right-left)*(top-down));
}
return 0;
}
2018-09-15 15:55:36
#include<stdio.h>
#include<math.h>
double Min(double a,double b)
{
if(a<b)
return a;
else
return b;
}
int main()
{
double a1,b1,a2,b2;
double A1,B1,A2,B2;
scanf("%lf%lf%lf%lf",&a1,&b1,&a2,&b2);
scanf("%lf%lf%lf%lf",&A1,&B1,&A2,&B2);
double left1,right1,left2,right2;
double down1,up1,down2,up2;
double x,y;
if(b1>b2) {left1=b2;right1=b1;}
else {left1=b1;right1=b2;}
if(a1>a2) {up1=a1;down1=a2;}
else {up1=a2;down1=a1;}
if(B1>B2) {left2=B2;right2=B1;}
else {left2=B1;right2=B2;}
if(A1>A2) {up2=A1;down2=A2;}
else {up2=A2;down2=A1;}
if(left1>=right2||left2>=right1||up1<=down2||up2<=down1)
printf("0.00\n");
else if((left1<=left2&&right1>=right2&&up2<=up1&&down2>=down1)||
(left2<=left1&&right2>=right1&&up1<=up2&&down1>=down2))
{
x=Min((right1-left1),(right2-left2));
y=Min((up1-down1),(up2-down2));
printf("%.2f\n",x*y);
}
else
{
if((left1<=left2&&right1>=right2)||(left2<=left1&&right2>=right1))
{
x=Min((right1-left1),(right2-left2));
y=Min(fabs(up2-down1),fabs(up1-down2));
printf("%.2f\n",x*y);
}
else if((up2<=up1&&down2>=down1)||(up1<=up2&&down1>=down2))
{
x=Min(fabs(right1-left2),fabs(right2-left1));
y=Min((up1-down1),(up2-down2));
printf("%.2f\n",x*y);
}
else
{
x=Min(fabs(right1-left2),fabs(right2-left1));
y=Min(fabs(up2-down1),fabs(up1-down2));
printf("%.2f\n",x*y);
}
}
return 0;
}
/**************************************************************
Problem: 1012
User: ok_man
Language: C
Result: Accepted
Time:0 ms
Memory:1092 kb
****************************************************************/
对比了一下,感觉还是有点长进的。。