Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Rectangle Area ใน C++: คำนวณพื้นที่รวมของสี่เหลี่ยมสองรูป

โจทย์

หาพื้นที่รวมที่ถูกครอบคลุมโดยสี่เหลี่ยมสองรูปในระนาบ 2D โดยแต่ละรูปกำหนดโดยมุมซ้ายล่าง (A,B) และมุมขวาบน (C,D) สำหรับรูปแรก และ (E,F) (G,H) สำหรับรูปที่สอง

แนวคิดการแก้ปัญหา

พื้นที่รวม = พื้นที่รูปแรก + พื้นที่รูปที่สอง - พื้นที่ทับซ้อน (ถ้ามี)

ขั้นตอน

  1. ตรวจสอบว่าไม่ทับซ้อนกัน: ถ้า C <= E || A >= G || B >= H || D <= F → คืนค่าผลรวมพื้นที่ทั้งสองเลย
  2. เก็บพิกัด x (A, C, E, G) ลงอาร์เรย์ h และพิกัด y (B, D, F, H) ลง v
  3. เรียงลำดับ h และ v
  4. พื้นที่ทับซ้อน = (h[2] - h[1]) * (v[2] - v[1])
  5. พื้นที่รวม = พื้นที่รูป1 + พื้นที่รูป2 - พื้นที่ทับซ้อน

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
        // ไม่ทับซ้อน
        if (C <= E || A >= G || B >= H || D <= F)
            return (C - A) * (D - B) + (G - E) * (H - F);
        
        vector<int> h = {A, C, E, G};
        vector<int> v = {B, D, F, H};
        sort(h.begin(), h.end());
        sort(v.begin(), v.end());
        
        long long overlap = 1LL * (h[2] - h[1]) * (v[2] - v[1]);
        long long total = 1LL * (C - A) * (D - B) + 1LL * (G - E) * (H - F);
        return total - overlap;
    }
};

int main() {
    Solution ob;
    cout << ob.computeArea(-3, 0, 3, 4, 0, -1, 9, 2); // 45
    return 0;
}

อินพุต / เอาต์พุต

Input: -3 0 3 4 0 -1 9 2

Output: 45

ความซับซ้อน

  • Time: O(1) - การเรียง 4 ค่า คงที่
  • Space: O(1)