1 条题解

  • 0
    @ 2025-4-14 18:41:37

    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;
    } 
    
    • 1

    【创新型】第11章:指针和数组 矩形相交的面积

    信息

    ID
    3048
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者