问题描述
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
输入格式
输入仅包含两行,每行描述一个矩形。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
输出格式
输出仅包含一个实数,为交的面积,保留到小数后两位。
样例输入
1 1 3 3
2 2 4 4
2 2 4 4
样例输出
1.00
要点:
1、判断是否相交
2、通脱对坐标进行排序求出中间相交部分的两个顶点(这个比较巧妙,刚开始我一直在画图,希望通过分类判断进行求解)
3、刚开始的输入不一定是从左到右的坐标需要进行调整
java实现(这个代码写的不太好)
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); double x1 = scanner.nextDouble(); double y1 = scanner.nextDouble(); double x2 = scanner.nextDouble(); double y2 = scanner.nextDouble(); if(x1>x2){ double temp = x1; x1 = x2; x2 = temp; } if(y1>y2){ double temp = y1; y1 = y2; y2 = temp; } double a1 = scanner.nextDouble(); double b1 = scanner.nextDouble(); double a2 = scanner.nextDouble(); double b2 = scanner.nextDouble(); if(a1>a2){ double temp = a1; a1 = a2; a2 = temp; } if(b1>b2){ double temp = b1; b1 = b2; b2 = temp; } //判断两个矩形是否相交 if(x2<=a1||y2<=b1||a2<=x1||b2<=y1){ System.out.println("0.00"); } else { double [] x ={x1,x2,a1,a2}; double [] y ={y1,y2,b1,b2}; Arrays.sort(x); Arrays.sort(y); double area = (x[2]-x[1])*(y[2]-y[1]); System.out.printf("%.2f ",Math.abs(area)); //System.out.println(); } } }
c++实现
#include<iostream> #include<algorithm> #include<cstdio> using namespace std; int main(){ double x[4]; double y[4]; for(int i=0;i<4;i++){ cin>>x[i]>>y[i]; } if(x[0]>x[1]){ swap(x[0],x[1]); } if(y[0]>y[1]){ swap(y[0],y[1]); } if(x[2]>x[3]){ swap(x[2],x[3]); } if(y[2]>y[3]){ swap(y[2],y[3]); } if(x[1]<=x[2]||y[1]<=y[2]||x[3]<=x[0]||y[3]<=y[0]){ cout<<"0.00"<<endl; } else{ sort(x,x+4); sort(y,y+4); //double area=(x[2]-x[1])*(y[2]-y[1]); printf("%.2lf ",(x[2] - x[1]) * (y[2] - y[1])); } return 0; }