3016 - 【创新型】第11章:指针和数组 矩形相交的面积
时间限制 : 1 秒
内存限制 : 128 MB
平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于每个矩形,我们给出它的一对相对顶点的坐标,请你编程算出两个矩形的交的面积。
题目输入
输入的第一行表示测试数据的组数N。
之后每一行给出四个数,每行描述一个矩形,相邻两行为一组。
在每行中,给出矩形的一对相对顶点的坐标,每个点的坐标都用两个绝对值不超过10^7的实数表示。
题目输出
每行输出一组矩形相交的面积值,注意输出回车,输出时保留两位小数。
输入/输出样例
输入格式
2 1 1 3 3 2 2 4 4 1 1 2 2 3 3 4 4
输出格式
1.00 0.00
C++解答
#include<iostream> #include<stdio.h> using namespace std; double areaOfintersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4); int main() { int N; cin >> N; double *x1 = new double[N]; double *x2 = new double[N]; double *x3 = new double[N]; double *x4 = new double[N]; double *y1 = new double[N]; double *y2 = new double[N]; double *y3 = new double[N]; double *y4 = new double[N]; double *S = new double[N]; for(int i = 0; i < N; i++) { cin >> x1[i] >> y1[i] >> x2[i] >> y2[i]; cin >> x3[i] >> y3[i] >> x4[i] >> y4[i]; S[i] = areaOfintersection(x1[i], y1[i], x2[i], y2[i], x3[i], y3[i], x4[i], y4[i]); } for(int i = 0; i < N; i++) { printf("%0.2lf\n", S[i]); } delete [] x1; delete [] x2; delete [] x3; delete [] x4; delete [] y1; delete [] y2; delete [] y3; delete [] y4; delete [] S; return 0; } //前提:两矩形的边都平行于X轴或者Y轴,x1,x2,x3,x4,y1,y2,y3,y4为矩形对角线的坐标1,2为一个,3,4为一个 double areaOfintersection(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4) { //确保x1 < x2 , y1 < y2 , x3 < x4 , y3 < y4 if(x1 > x2) { x1 += x2; x2 = x1 - x2; x1 -= x2; } if(y1 > y2) { y1 += y2; y2 = y1 - y2; y1 -= y2; } if(x3 > x4) { x3 += x4; x4 = x3 - x4; x3 -= x4; } if(y3 > y4) { y3 += y4; y4 = y3 - y4; y3 -= y4; } // double S = 0;//相交的面积 double a = 0;//a,b为相交的矩形的两边长 double b = 0; bool flag_x42 = x4 >= x2 ? 1 : 0; bool flag_x41 = x4 >= x1 ? 1 : 0; bool flag_x32 = x3 >= x2 ? 1 : 0; bool flag_x31 = x3 >= x1 ? 1 : 0; bool flag_y42 = y4 >= y2 ? 1 : 0; bool flag_y41 = y4 >= y1 ? 1 : 0; bool flag_y32 = y3 >= y2 ? 1 : 0; bool flag_y31 = y3 >= y1 ? 1 : 0; //x4 > x2 > x3 > x1, y4 > y2 > y3 > y1 if(flag_x42 && flag_x41 && !flag_x32 && flag_x31 && flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x2 - x3; b = y2 - y3; S = a * b; } //x4 > x2 > x3 > x1, y4 > y2 > y1 > y3 if(flag_x42 && flag_x41 && !flag_x32 && flag_x31 && flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x2 - x3; b = y2 - y1; S = a * b; } //x4 > x2 > x1 > x3, y4 > y2 > y3 > y1 if(flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x2 - x1; b = y2 - y3; S = a * b; } //x4 > x2 > x1 > x3, y4 > y2 > y1 > y3 if(flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x2 - x1; b = y2 - y1; S = a * b; } //x4 > x2 > x3 > x1, y2 > y4 > y3 > y1 if(flag_x42 && flag_x41 && !flag_x32 && flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x2 - x3; b = y4 - y3; S = a * b; } //x4 > x2 > x1 > x3, y2 > y4 > y3 > y1 if(flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x2 - x1; b = y4 - y3; S = a * b; } //x4 > x2 > x3 > x1, y2 > y4 > y1 > y3 if(flag_x42 && flag_x41 && !flag_x32 && flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x2 - x3; b = y4 - y1; S = a * b; } //x4 > x2 > x1 > x3, y2 > y4 > y1 > y3 if(flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x2 - x1; b = y4 - y1; S = a * b; } //x2 > x4 > x3 > x1, y4 > y2 > y3 > y1 if(!flag_x42 && flag_x41 && !flag_x32 && flag_x31 && flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x4 - x3; b = y2 - y3; S = a * b; } //x2 > x4 > x1 > x3, y4 > y2 > y3 > y1 if(!flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x4 - x1; b = y2 - y3; S = a * b; } //x2 > x4 > x3 > x1, y4 > y2 > y1 > y3 if(!flag_x42 && flag_x41 && !flag_x32 && flag_x31 && flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x4 - x3; b = y2 - y1; S = a * b; } //x2 > x4 > x1 > x3, y4 > y2 > y1 > y3 if(!flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x4 - x3; b = y2 - y3; S = a * b; } //x2 > x4 > x3 > x1, y2 > y4 > y3 > y1 if(!flag_x42 && flag_x41 && !flag_x32 && flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x4 - x3; b = y4 - y3; S = a * b; } //x2 > x4 > x1 > x3, y2 > y4 > y3 > y1 if(!flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && flag_y31) { a = x4 - x1; b = y4 - y3; S = a * b; } //x2 > x4 > x3 > x1, y2 > y4 > y1 > y3 if(!flag_x42 && flag_x41 && !flag_x32 && flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x4 - x3; b = y4 - y1; S = a * b; } //x2 > x4 > x1 > x3, y2 > y4 > y1 > y3 if(!flag_x42 && flag_x41 && !flag_x32 && !flag_x31 && !flag_y42 && flag_y41 && !flag_y32 && !flag_y31) { a = x4 - x3; b = y4 - y3; S = a * b; } return S; }