# 資訊之芽 2024 C班階段考 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; } ```