蓝桥杯真题——矩形面积交集

问题展示

问题分析:

1.矩形具有多个变量,属于复杂变量,所以采用结构体表示

2.判断交集应采取,两个矩形上角的较小值作为交集的右边界,两个矩形上角的较大值作为交集的上边界,两个矩形下角的较大值作为交集的左边界,两个矩形下角的较小值作为交集的下边界。

注:这里相对顶点坐标采用的是左下右上为一对顶点。

3.应该具有判断交集是否成立的条件。

代码展示

#include <stdio.h>
#include <stdlib.h>

struct P {
    int x;
    int y;
} P1, P2;

struct S {
    struct P top;
    struct P bottom;
} S1, S2;

double together(struct S* S1, struct S* S2) {
    int right = S1->top.x < S2->top.x ? S1->top.x : S2->top.x; // 交集的右边界
    int top = S1->top.y < S2->top.y ? S1->top.y : S2->top.y; // 交集的上边界
    int left = S1->bottom.x > S2->bottom.x ? S1->bottom.x : S2->bottom.x; // 交集的左边界
    int bottom = S1->bottom.y > S2->bottom.y ? S1->bottom.y : S2->bottom.y; // 交集的下边界

    if (left < right && top > bottom) { // 检查是否有交集
        int width = right - left;
        int height = top - bottom;
        return (double)width * height;
    }
    else {
        return 0.0;
    }
}

int main() {
    scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);
    S1.top = P2;
    S1.bottom = P1;
    scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);
    S2.top = P2;
    S2.bottom = P1;
    double area = together(&S1, &S2);
    if (area == 0)printf("矩形无交集");
    else printf("%.2lf", area);
    return 0;
}

代码逐步分析

  • 定义两个结构体,一个表示点(struct P), 一个表示矩形(struct S)。
  • 名为P的结构体,包含两个整型成员xy,分别代表点的横坐标和纵坐标。同时声明了两个P类型的变量P1P2
  • 名为S的结构体,包含两个P类型的成员topbottom,分别代表矩形的上角和下角。同时声明了两个S类型的变量S1S2
  • 定义了一个名为together的函数,接受两个指向S结构体的指针作为参数,用于计算两个矩形的交集面积,并返回面积值。
  1. scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);使用scanf_s函数读取两个点的坐标,分别赋值给P1P2。这里需要注意,P1P2的成员赋值顺序与结构体定义有关,需要确保top是上角,bottom是下角。
  2. S1.top = P2;
    S1.bottom = P1;将读取的坐标赋值给S1topbottom成员。这里需要注意,top应该是上角,bottom应该是下角。
  3. scanf_s("%d %d %d %d", &P1.x, &P1.y, &P2.x, &P2.y);再次读取两个点的坐标,这次是为了获取第二个矩形的坐标。
  4. double area = together(&S1, &S2);调用together函数,传入S1S2的地址,计算两个矩形的交集面积。
  5. if (area == 0) printf("矩形无交集");
    else printf("%.2lf", area);根据计算出的面积值,输出结果。如果面积为0,则输出“矩形无交集”;否则,输出交集面积,保留两位小数。

together函数

  • together的函数,接受两个指向S结构体的指针作为参数,用于计算两个矩形的交集面积,并返回面积值。
  • together函数中,通过比较两个矩形的上角和下角坐标,计算交集的上边界、下边界、左边界和右边界:

    • right:取两个矩形上角的较小值作为交集的右边界。
    • top:取两个矩形上角的较大值作为交集的上边界。
    • left:取两个矩形下角的较大值作为交集的左边界。
    • bottom:取两个矩形下角的较小值作为交集的下边界。

检查交集并计算面积

if (left < right && top > bottom) {
    int width = right - left;
    int height = top - bottom;
    return (double)width * height;
}
else {
    return 0.0;
}

  • 通过检查左边界是否小于右边界且上边界大于下边界来判断两个矩形是否有交集。如果有交集,则计算交集的宽度和高度,并返回交集面积;如果没有交集,则返回0.0。

注意:在函数用传参用的是结构体指针,结构体用指针传参数可以减少函数调用是时的复制开销,可以提高代码的效率。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值