一、解题思路:
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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复