华为OD-2024年E卷-矩形相交的面积[100分] -- python

问题描述:

给出3组点坐标(x, y, w, h),-1000 (x, y, w, h)表示平面直角坐标系中的一个矩形:
x, y为矩形左上角坐标点,w, h向右w,向下h。
(x, y, w, h)表示x轴(x, x+w)和y轴(y, y-h)围成的矩形区域;
(0, 0, 2, 2)表示 x轴(0, 2)和y 轴(0, -2)围成的矩形区域;
(3, 5, 4, 6)表示x轴(3, 7)和y轴(5, -1)围成的矩形区域;
求3组坐标构成的矩形区域重合部分的面积。
输入描述
3行输入分别为3个矩形的位置,分别代表“左上角x坐标”,“左上角y坐标”,“矩形宽”,“矩形高” -1000 <= x,y < 1000
输出描述
输出3个矩形相交的面积,不相交的输出0。

输入示例

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

输出示例

2

华为OD-2024年E卷-矩形相交的面积[100分] -- python_第1张图片

解题思路:

本题主要需要一个清晰的思路:难点在于矩形相交的判断 以及 相交时相交区域计算。

矩形相交:

给出的是矩形的点坐标形式,主要关注关于这部分的描述:

(x, y, w, h)表示x轴(x, x+w)和y轴(y, y-h)围成的矩形区域;

矩形是由这四条线围成的区域也就是(x < 横坐标

所以判断矩形相交也就可以看做判断横线以及纵线是否有相交部分。

相交情况:内部以及交叉

不想交情况:外部

所以逆向思维:不相交

一组横线中较大的横(/纵)坐标值小于另一组横线较小的横(/纵)坐标值。

相交区域:

仍然以一组横线作讨论:

内部:

小的更小,大的更大

交叉:

小的比小的小,大的也比大的小(大的比小的大,如果为false:这样就是不相交了,不必讨论)

#如果相交,计算相交区域(横线、纵线)
def func1(a1,a2,b1,b2):
    x1, x2 = 0, 0
    if a1 < b1 and a2 > b2:
        x1 = a1
        x2 = b1
    elif a1 = b3 or b4 >= a3:
        return (0,0,0,0)
    else:
        x1, x2 = func1(a1, a2, b1, b2)#横线
        y2, y1 = func1(a4, a3, b4, b3)#纵线,由于是向下,更换大小顺序
        return (x1, x2, y1, y2)

arr = []
for i in range(3):
    (a,b,c,d) = list(map(int, input().split()))
    arr.append((a, a+c, b, b-d))
(a,b,c,d)=func2(*arr[0], *arr[1])#第一组
(ans1,ans2,ans3,ans4)=func2(a,b,c,d,*arr[2])#第二组
res = (ans2-ans1)*(ans3-ans4)#不相交:返回值为(0,0,0,0),结果仍为0
print(res)

你可能感兴趣的:(python,java,算法)