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 |
数据范围
- 为正整数
题解
推公式
首先,需要理解矩形在坐标系中的表示方式。每个矩形由左上角坐标 和宽度 、高度 定义。矩形的右下角坐标可以通过 计算得到。
解决这个问题的关键在于找出三个矩形重叠区域的边界。我们可以这样思考:
- 重叠区域的左边界是三个矩形左边界的最大值。
- 重叠区域的右边界是三个矩形右边界的最小值。
- 重叠区域的上边界是三个矩形上边界的最小值。
- 重叠区域的下边界是三个矩形下边界的最大值。
有了这些信息,我们就可以计算重叠区域的宽度和高度:
- 宽度 = 右边界 - 左边界
- 高度 = 上边界 - 下边界
如果计算出的宽度或高度小于等于 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%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记