基础训练:矩形面积交

本题思考

最开始我是分情况讨论各种相交的情况,发现判断语句写的非常繁琐,容易漏掉情况。其实这道题最简单的做法是:
(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;
}
发布了45 篇原创文章 · 获赞 50 · 访问量 3530

猜你喜欢

转载自blog.csdn.net/wjinjie/article/details/104659068