---
# System prepended metadata

title: 資訊之芽 2024 Ｃ班階段考 pB 題解

---

# 資訊之芽 2024 Ｃ班階段考 pC 題解

## 題目
![image](https://hackmd.io/_uploads/H18M8tzfA.png)

給定兩個長方形左下與右上角的座標，計算它們涵蓋的總面積。

## 思路
**總面積 $=$ 兩個長方形面積加總 $-$ 重合的面積**
因此我們先計算兩個長方形的面積總和，再計算重合面積，相減就可以得到涵蓋總面積。

### 計算重合面積
這題花較多時間的問題就是如何計算重合面積。如果你沒有想法，可以參考以下的邏輯：
+ 如果兩個長方形「右上角的 $x$」最小值比兩個長方形「左下角的 $x$」最大值還大，就表示兩個長方形在 $x$ 方向有重疊的部分。
+ 同理，如果兩個長方形「右上角的 $y$」最小值比兩個長方形「左下角的 $y$」最大值還大，就表示兩個長方形在 $y$ 方向有重疊的部分。
+ 如果以上兩個條件皆成立，表示兩個長方形有重疊面積。

## Code

```cpp=
#include <iostream>

using namespace std;
 
int min(int a, int b) {
    if(a < b) return a;
    return b;
}
 
int max(int a, int b) {
    if(a > b) return a;
    return b;
}
 
int area(int x1, int y1, int x2, int y2) {
    return (x2 - x1) * (y2 - y1);
}
 
int main() {
    // 第一個長方形的左下和右上角座標
    int p1x, p1y, p2x, p2y;
    
    // 第二個長方形的左下和右上角座標
    int p3x, p3y, p4x, p4y;
    
    cin >> p1x >> p1y >> p2x >> p2y;
    cin >> p3x >> p3y >> p4x >> p4y;
    
    // 計算兩個長方形面積加總
    int totalArea = area(p1x, p1y, p2x, p2y) +
        area(p3x, p3y, p4x, p4y);
    
    // w 表示重疊面積的寬
    int w = min(p2x, p4x) - max(p1x, p3x);
    
    // h 表示重疊面積的高
    int h = min(p2y, p4y) - max(p1y, p3y);
    
    // 如果有重疊面積，就將面積總和減去重疊面積
    if (w > 0 && h > 0) totalArea -= w * h;
 
    cout << totalArea << endl;
 
    return 0;
}
```