題目描述
給出3組點坐標(x, y, w, h),-1000<x,y<1000,w,h為正整數。
(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
說明
矩形重疊面積計算算法詳解
核心解題思路
本題目要求計算三個矩形重合部分的面積。核心思路是通過分析矩形在x軸和y軸上的投影,確定三個矩形共同重疊的區域。解題步驟如下:
關鍵步驟
-
矩形坐標轉換:
- 每個矩形由左上角坐標(x,y)、寬度w、高度h定義
- x軸投影:左邊界x,右邊界x + w
- y軸投影:由于坐標系向下為負,上邊界y,下邊界y - h
-
重疊區域確定:
- x軸重疊:取三個矩形左邊界最大值作為重疊左邊界,右邊界最小值作為重疊右邊界
- y軸重疊:取三個矩形上邊界最小值作為重疊上邊界,下邊界最大值作為重疊下邊界
- 重疊寬度:重疊右邊界 - 重疊左邊界
- 重疊高度:重疊上邊界 - 重疊下邊界
-
面積計算:
- 當重疊寬度和高度都為正時,面積 = 寬度 × 高度
- 否則面積為0
完整代碼實現
def main():# 讀取三個矩形的參數rects = []for _ in range(3):data = input().split()# 轉換為浮點數處理(題目整數但為統一接口)x = float(data[0])y = float(data[1])w = float(data[2])h = float(data[3])rects.append((x, y, w, h))# 計算三個矩形的x軸重疊區域left_bound = max(rects[0][0], rects[1][0], rects[2][0])right_bound = min(rects[0][0] + rects[0][2], rects[1][0] + rects[1][2], rects[2][0] + rects[2][2])# 計算三個矩形的y軸重疊區域top_bound = min(rects[0][1], rects[1][1], rects[2][1])bottom_bound = max(rects[0][1] - rects[0][3],rects[1][1] - rects[1][3],rects[2][1] - rects[2][3])# 計算重疊區域的寬度和高度width = right_bound - left_boundheight = top_bound - bottom_bound# 計算重疊面積(當寬度和高度都為正時)if width > 0 and height > 0:area = width * heightelse:area = 0# 輸出整數部分(題目要求整數)print(int(area))if __name__ == "__main__":main()
算法原理解析
1. 矩形投影原理
# 矩形在x軸投影:[x, x + w]
# 矩形在y軸投影:[y - h, y]
- x軸:從左邊界x到右邊界x+w
- y軸:從下邊界y-h到上邊界y(注意坐標系向下為負)
2. 重疊區域計算
# x軸重疊
left_bound = max(rect1_x, rect2_x, rect3_x)
right_bound = min(rect1_x + w1, rect2_x + w2, rect3_x + w3)# y軸重疊
top_bound = min(rect1_y, rect2_y, rect3_y)
bottom_bound = max(rect1_y - h1, rect2_y - h2, rect3_y - h3)
- 左邊界:取三個矩形左邊界最大值(最右邊的左邊界)
- 右邊界:取三個矩形右邊界最小值(最左邊的右邊界)
- 上邊界:取三個矩形上邊界最小值(最靠下的上邊界)
- 下邊界:取三個矩形下邊界最大值(最靠上的下邊界)
3. 面積計算邏輯
width = right_bound - left_bound
height = top_bound - bottom_bound
if width > 0 and height > 0:area = width * height
else:area = 0
- 有效性檢查:寬度和高度必須為正才有重疊
- 整數輸出:題目要求輸出整數部分
示例解析
示例輸入:
1 6 4 4
3 5 3 4
0 3 7 3
步驟解析:
-
矩形1:x=1, y=6, w=4, h=4
- x軸:[1, 5]
- y軸:[6-4, 6] = [2, 6]
-
矩形2:x=3, y=5, w=3, h=4
- x軸:[3, 6]
- y軸:[5-4, 5] = [1, 5]
-
矩形3:x=0, y=3, w=7, h=3
- x軸:[0, 7]
- y軸:[3-3, 3] = [0, 3]
-
重疊區域計算:
-
x軸:左邊界 = max(1, 3, 0) = 3
右邊界 = min(5, 6, 7) = 5
寬度 = 5 - 3 = 2 -
y軸:上邊界 = min(6, 5, 3) = 3
下邊界 = max(2, 1, 0) = 2
高度 = 3 - 2 = 1
-
-
面積:2 × 1 = 2
輸出:2
邊界情況測試
測試1:完全重疊
輸入:
0 10 10 10
0 10 10 10
0 10 10 10計算:
x軸:max(0,0,0)=0, min(10,10,10)=10 → 寬度=10
y軸:min(10,10,10)=10, max(0,0,0)=0 → 高度=10
面積=100
測試2:部分重疊
輸入:
1 5 4 5
2 6 4 4
3 4 5 6計算:
矩形1:x[1,5], y[0,5]
矩形2:x[2,6], y[2,6]
矩形3:x[3,8], y[-2,4]x軸:max(1,2,3)=3, min(5,6,8)=5 → 寬度=2
y軸:min(5,6,4)=4, max(0,2,-2)=2 → 高度=2
面積=4
測試3:無重疊
輸入:
0 10 2 2
3 8 2 2
5 5 2 2計算:
x軸:max(0,3,5)=5, min(2,5,7)=2 (5>2)
寬度=2-5=-3 → 無效
面積=0
總結與擴展
關鍵知識點
- 矩形表示:理解坐標系中矩形的數學表示
- 投影分析:將二維問題分解為兩個一維問題
- 邊界計算:最大值最小值確定重疊區域
- 有效性檢查:處理無重疊情況
擴展思考
-
非軸對齊矩形:
# 使用旋轉矩陣處理旋轉的矩形 def rotate_rect(rect, angle):# 計算旋轉后的頂點# 使用分離軸定理檢測重疊
-
三維空間重疊:
def clip_cuboids(cuboids):# 在x,y,z三個維度分別計算# 計算體積而非面積
-
部分重疊閾值:
def clip_with_threshold(rects, threshold=0.5):# 計算重疊面積與總面積的比例# 返回滿足閾值的重疊區域
-
漸進式計算:
class OverlapCalculator:def __init__(self):self.left = -float('inf')self.right = float('inf')self.top = float('inf')self.bottom = -float('inf')def add_rect(self, x, y, w, h):self.left = max(self.left, x)self.right = min(self.right, x + w)self.top = min(self.top, y)self.bottom = max(self.bottom, y - h)return self.get_overlap()def get_overlap(self):width = self.right - self.leftheight = self.top - self.bottomif width > 0 and height > 0:return width * heightreturn 0
核心啟示:通過將復雜問題分解為簡單維度,利用邊界值分析確定交集,本算法高效解決了多矩形重疊面積計算問題。這種"分而治之"的思路是解決復雜幾何問題的核心策略。
初學者可從中學習:
- 空間問題的降維處理技巧
- 邊界值分析的數學方法
- 算法效率與簡潔性的平衡
- 實際問題的數學模型構建
- 算法擴展與適用性分析能力