蓝桥杯 矩形面积交

题意

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
****************************************************************/

 

对比了一下,感觉还是有点长进的。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值