一、解题思路:

    Tips:可以自己动手作图进行理解可能更加易懂哦!
                一、默认纵轴方向为宽(W),横轴方向为长(L)

                二、相交条件的寻找:    比较 纵坐标俩最值的距离(Max_Y - Min_Y)  与 两矩形宽之和(W1+W2) 以及 横坐标俩最值的距离(Max_X - Min_X) 与 两矩形宽之和(L1+L2) 的关系

                    1)若纵坐标俩最值的距离(Max_Y - Min_Y)<两矩形宽之和(W1+W2)且横坐标俩最值的距离(Max_X - Min_Y)<两矩形长之和(L1+L2),则说明两矩形会重合;

                    2)与1)相反则为不重合。

                三、、相交面积的计算方法:

                    1、在满足相交的情况下:

                                1)若纵坐标俩最值的距离(Max_Y - Min_Y) == 第一个矩形的宽(W1),则说明相交图形的宽大小等于第二个矩形的宽(W2),同时容易看出:相交图形的长等于两矩形长之和(L1-L2) - 横坐标俩最值的距离(Max_X - Min_X);

                                2)同理可得,若纵坐标俩最值的距离(Max_Y - Min_Y) == 第二个矩形的宽(W2),则说明相交图形的宽大小等于第一个矩形的宽(W1),相交图形的长仍等于两矩形长之和(L1-L2) - 横坐标俩最值的距离(Max_X - Min_X)。

                    2、在不相交的情况下:

                                直接定义相交面积为0.00即可。


二、注意事项:

                一、此方法是利用大量数据建立起来的,故需要仔细定义并初始化变量,尽可能让变量名见名知意,避免定义变量名混淆;

                二、读懂题目,理清条件:

                            1、记得最终结果保留小数位数;

                            2、“每个点的坐标都用两个绝对值不超过10^7的实数表示”--> 提醒我们数据类型应该使用浮点数中的double类型。


三、最终代码实现途径:

            1、库的调用:C/C++的iostream、cmath库、iomanip库

            2、函数调用以及功能:

                        1)主函数main() :程序入口

                        2)自定义最大值函数double isMax(double* arr)  :  找一组数的最大值

                        3)自定义最小值函数double isMin(double* arr)  :找一组数的最小值

                        4)cmath库的绝对值函数fabs()  :  求某数的绝对值--->本题用于求解差值绝对值

            3、坐标存放:

                        为方便分别比较找出所有横坐标以及纵坐标的最值,故选用数组(RectangleSign_x[4]、RectangleSign_y[4])分别存放

            4、利用for() {}循环结构输入坐标信息

            5、利用if-else if-else选择语句以及嵌套if语句实现判断是否相交以及面积计算的情况


四、参考代码:        

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
double isMax(double* arr)  //求最大值
{
	double max = arr[0];
	for (int i = 0; i < 4; i++)
	{
		if (arr[i] > max)
			max = arr[i];
	}
	return max;
}
double isMin(double* arr)  //求最小值
{
	double min = arr[0];
	for (int i = 0; i < 4; i++)
	{
		if (arr[i] < min)
			min = arr[i];
	}
	return min;
}
int main()
{
	int i;
	double RectangleSign_x[4], RectangleSign_y[4]; //分别存放两个矩形的横坐标和纵坐标
	for (i = 0; i < 4; i++)
		cin >> RectangleSign_x[i] >> RectangleSign_y[i];  //输入坐标信息
	double L1 = 0, L2 = 0, W1 = 0, W2 = 0, Min_X, Max_X, Min_Y, Max_Y, dA;   //定义两个矩形的长和宽
	L1 = fabs(RectangleSign_x[0] - RectangleSign_x[1]);
	L2 = fabs(RectangleSign_x[2] - RectangleSign_x[3]);
	W1 = fabs(RectangleSign_y[0] - RectangleSign_y[1]);
	W2 = fabs(RectangleSign_y[2] - RectangleSign_y[3]);
	Max_X = isMax(RectangleSign_x);  //求横坐标最值
	Min_X = isMin(RectangleSign_x);
	Max_Y = isMax(RectangleSign_y);  //求纵坐标最值
	Min_Y = isMin(RectangleSign_y);
	if (Max_Y - Min_Y < W1 + W2&&Max_X-Min_X<L1+L2)   //判断是否重合
	{
		if (Max_Y - Min_Y == W1)
			dA = W2 * (L1 + L2 - (Max_X - Min_X));
		else if (Max_Y - Min_Y == W2)
			dA = W1 * (L1 + L2 - (Max_X - Min_X));
		else
			dA = (L1 + L2 - (Max_X - Min_X)) * (W1 + W2 - (Max_Y - Min_Y));
	}
	else
		dA = 0.00;
	cout << fixed << setprecision(2) << dA << endl;   //保留两位小数
	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论