E-矩形相交的面积(100p)

矩形相交的面积

问题描述

在平面直角坐标系中,给出 3 个矩形的位置信息。每个矩形由左上角坐标 和宽度 、高度 表示。矩形的边平行于坐标轴,宽度向右延伸,高度向下延伸。请计算这 3 个矩形重叠部分的面积。

输入格式

输入共 3 行,每行包含 4 个整数 ,分别表示一个矩形的左上角 坐标、左上角 坐标、宽度和高度。

输出格式

输出一个整数,表示 3 个矩形重叠部分的面积。如果没有重叠,则输出 0。

样例输入1

1 6 4 4
3 5 3 4
0 3 7 3

样例输出1

2

样例解释

样例 解释说明
样例1 三个矩形分别为:
1.
2.
3.
重叠部分面积为 2

数据范围

  • 为正整数

题解

推公式

首先,需要理解矩形在坐标系中的表示方式。每个矩形由左上角坐标 和宽度 、高度 定义。矩形的右下角坐标可以通过 计算得到。

解决这个问题的关键在于找出三个矩形重叠区域的边界。我们可以这样思考:

  1. 重叠区域的左边界是三个矩形左边界的最大值。
  2. 重叠区域的右边界是三个矩形右边界的最小值。
  3. 重叠区域的上边界是三个矩形上边界的最小值。
  4. 重叠区域的下边界是三个矩形下边界的最大值。

有了这些信息,我们就可以计算重叠区域的宽度和高度:

  • 宽度 = 右边界 - 左边界
  • 高度 = 上边界 - 下边界

如果计算出的宽度或高度小于等于 0,说明没有重叠区域,此时面积为 0。否则,重叠区域的面积就是宽度乘以高度。

参考代码

  • Python
def calculate_overlap_area(rectangles):
    # 提取三个矩形的参数
    x1, y1, w1, h1 = rectangles[0]  # 矩形1
    x2, y2, w2, h2 = rectangles[1]  # 矩形2
    x3, y3, w3, h3 = rectangles[2]  # 矩形3

    # 计算每个矩形的右下角坐标
    x1_br, y1_br = x1 + w1, y1 - h1
    x2_br, y2_br = x2 + w2, y2 - h2
    x3_br, y3_br = x3 + w3, y3 - h3

    # 计算重叠区域的边界
    overlap_left = max(x1, x2, x3)
    overlap_right = min(x1_br, x2_br, x3_br)
    overlap_top = min(y1, y2, y3)
    overlap_bottom = max(y1_br, y2_br, y3_br)

    # 计算重叠区域的宽度和高度
    overlap_width = overlap_right - overlap_left
    overlap_height = overlap_top - overlap_bottom

    # 如果宽度和高度都大于0,计算面积;否则返回0
    if overlap_width > 0 and overlap_height > 0:
        return overlap_width * overlap_height
    else:
        return 0

# 读取输入
rectangles = [list(map(int, input().split())) for _ in range(3)]

# 计算重叠面积并输出
result = calculate_overlap_area(rectangles)
print(result)
  • C
#include <stdio.h>
#include <stdlib.h>

// 定义矩形结构体
typedef struct {
    int x, y, w, h;
} Rectangle;

// 计算三个矩形重叠面积的函数
int calculate_overlap_area(Rectangle r1, Rectangle r2, Rectangle r3) {
    // 计算每个矩形的右下角坐标
    int x1_br = r1.x + r1.w, y1_br = r1.y - r1.h;
    int x2_br = r2.x + r2.w, y2_br = r2.y - r2.h;
    int x3_br = r3.x + r3.w, y3_br = r3.y - r3.h;

    // 计算重叠区域的边界
    int overlap_left = (r1.x > r2.x ? r1.x : r2.x) > r3.x ? (r1.x > r2.x ? r1.x : r2.x) : r3.x;
    int overlap_right = (x1_br < x2_br ? x1_br : x2_br) < x3_br ? (x1_br < x2_br ? x1_br : x2_br) : x3_br;
    int overlap_top = (r1.y < r2.y ? r1.y : r2.y) < r3.y ? (r1.y < r2.y ? r1.y : r2.y) : r3.y;
    int overlap_bottom = (y1_br > y2_br ? y1_br : y2_br) > y3_br ? (y1_br > y2_br ? y1_br : y2_br) : y3_br;

    // 计算重叠区域的宽度和高度
    int overlap_width = overlap_right - overlap_left;
    int overlap_height = overlap_top - overlap_bottom;

    // 如果宽度和高度都大于0,计算面积;否则返回0
    if (overlap_width > 0 && overlap_height > 0) {
        return overlap_width * overlap_height;
    } else {
        return 0;
    }
}

int main() {
    Rectangle rectangles[3];
    
    // 读取输入
    for (int i = 0; i < 3; i++) {
        scanf("%d %d %d %d", &rectangles[i].x, &rectangles[i].y, &rectangles[i].w, &rectangles[i].h);
    }

    // 计算重叠面积并输出
    int result = calculate_overlap_area(rectangles[0], rectangles[1], rectangles[2]);
    printf("%d\n", result);

    return 0;
}
  • Javascript
// 读取输入的函数
const r

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务