解题思路:

1、先判断两个矩形是否有重合部分

2、利用排序计算重合部分面积(中间两坐标差值之积)


1、如何判断

假设 a1 为矩形A的左下端点,a2 为A的右上端点

同样的,假设 b1, b2分别为矩形B的左下和右上端点

那么A与B有重合部分的充要条件是,任一矩形的左下端点均在令一矩形的右上端点的左下方

即,a1在b2的左下方,且b1在a2的左下方


1614574633350056.png

矩形的左下端点坐标是输入的两横纵坐标中较小值的组合,相对的,右上端点是较大值的组合

一个点的横纵坐标均比另一个的坐标小,则前者在后者的左下方


2、如何计算重合部分面积

将输入四个横坐标与纵坐标排序,位于中间的两组坐标表示的即为重合部分的矩阵

排序后的中间两坐标差值之积即为所求面积

QQ截图20210301124825.png


参考代码:

#include <bits/stdc++.h>
 
using namespace std;
 
class point         //定义"点"类,可用大小为2的数组代替
{
public:
    double x;
    double y;
};
 
bool mycheck(point a, point b)              //函数:判断点a是否在点b左下方
{
    return (a.x < b.x && a.y < b.y);
}
 
int main()
{
    double x[4];                //记录输入的横坐标
    double y[4];                //记录输入的纵坐标
 
    point a1, a2, b1, b2;       //定义矩阵A与B的左下和右上端点,1为左下,2为右上
 
    for (int i = 0; i < 4; i++)     //循环输入
    {
        cin >> x[i] >> y[i];
    }
    //寻找两矩阵的左下右上端点
    a1.x = fmin(x[0], x[1]), a1.y = fmin(y[0], y[1]);
    a2.x = fmax(x[0], x[1]), a2.y = fmax(y[0], y[1]);
 
    b1.x = fmin(x[2], x[3]), b1.y = fmin(y[2], y[3]);
    b2.x = fmax(x[2], x[3]), b2.y = fmax(y[2], y[3]);
 
    double ans = 0;             //定义答案
    if (mycheck(b1, a2) && mycheck(a1, b2))     //判断是否重合
    {
        sort(x, x + 4);                         //横坐标排序
        sort(y, y + 4);                         //纵坐标排序
        ans = (x[2] - x[1]) * (y[2] - y[1]);    //计算答案
    }
    printf("%.2f\n", ans);                      //输出
    return 0;
}


点赞(0)
 

0.0分

16 人评分

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

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

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

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

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

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

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

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

评论列表 共有 2 条评论

Allen 2年前 回复TA
tql
二十一画生 3年前 回复TA
我跟楼主想的一样,但是简化判断条件这方面还是查了一大截,学习到了