কম্পিউটার টিউটোরিয়াল

C++-এ পারফেক্ট রেক্ট্যাঙ্গেল (Perfect Rectangle) যাচাই


ধরি আমাদের Nটি অ্যাক্সিস-আলাইনড (axis-aligned) রেক্ট্যাঙ্গেল আছে। আমাদের যাচাই করতে হবে কি সেগুলো মিলে একটি সম্পূর্ণ রেক্ট্যাঙ্গুলার অঞ্চল (rectangular region) তৈরি করে কিনা। প্রতিটি রেক্ট্যাঙ্গেল নিচের-বাম (bottom-left) এবং উপরের-ডান (top-right) পয়েন্ট দিয়ে প্রতিনিধিত্ব করা হয়। যেমন একটি ইউনিট স্কোয়ার হল [1,1,2,2] (bottom-left (1,1), top-right (2,2))।

উদাহরণস্বরূপ, rectangles = [[1,1,3,3],[3,1,4,2],[3,2,4,4],[1,3,2,4],[2,3,3,4]] হলে আউটপুট হবে true কারণ এই ৫টি রেক্ট্যাঙ্গেল মিলে একটি সম্পূর্ণ রেক্ট্যাঙ্গুলার অঞ্চল তৈরি করে।

C++-এ পারফেক্ট রেক্ট্যাঙ্গেল (Perfect Rectangle) যাচাই

সমাধানের ধাপসমূহ

  • একটি সেট visited সংজ্ঞায়িত।
  • area := 0
  • x2 := -INF, x1 := INF
  • y2 := -INF, y1 := INF
  • প্রতিটি r ইন re-র জন্য:
    • x1 = min(r[0], x1)
    • x2 = max(r[2], x2)
    • y1 = min(r[1], y1)
    • y2 = max(r[3], y2)
    • area += (r[2]-r[0]) * (r[3]-r[1])
    • s1 := r[0] + r[1] (স্ট্রিং ক্যাটেনেশন)
    • s2 := r[0] + r[3]
    • s3 := r[2] + r[3]
    • s4 := r[2] + r[1]
    • যদি s1 visited-এ থাকে: visited থেকে s1 ডিলিট, অন্যথায় ইনসার্ট।
    • s2, s3, s4-র জন্যও একই কাজ।
  • s1 := x1+y1, s2 := x2+y1, s3 := x1+y2, s4 := x2+y2 (স্ট্রিং ক্যাটেনেশন)
  • যদি s1, s2, s3, s4 সব visited-এ না থাকে: false ফেরত।
  • ফেরত: area == (x2-x1)*(y2-y1)

প্রোগ্রাম উদাহরণ

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

class Solution {
public:
    bool isRectangleCover(vector>& re) {
        unordered_set visited;
        int area = 0;
        int x2 = INT_MIN;
        int x1 = INT_MAX;
        int y2 = INT_MIN;
        int y1 = INT_MAX;
        for (auto &r : re) {
            x1 = min(r[0], x1);
            x2 = max(r[2], x2);
            y1 = min(r[1], y1);
            y2 = max(r[3], y2);
            area += (r[2] - r[0]) * (r[3] - r[1]);
            string s1 = to_string(r[0]) + to_string(r[1]);
            string s2 = to_string(r[0]) + to_string(r[3]);
            string s3 = to_string(r[2]) + to_string(r[3]);
            string s4 = to_string(r[2]) + to_string(r[1]);
            if (visited.count(s1)) {
                visited.erase(s1);
            } else
                visited.insert(s1);
            if (visited.count(s2)) {
                visited.erase(s2);
            } else
                visited.insert(s2);
            if (visited.count(s3)) {
                visited.erase(s3);
            } else
                visited.insert(s3);
            if (visited.count(s4)) {
                visited.erase(s4);
            } else
                visited.insert(s4);
        }
        string s1 = to_string(x1) + to_string(y1);
        string s2 = to_string(x2) + to_string(y1);
        string s3 = to_string(x1) + to_string(y2);
        string s4 = to_string(x2) + to_string(y2);
        if (!visited.count(s1) || !visited.count(s2) || !visited.count(s3) || !visited.count(s4) || visited.size() != 4)
            return false;
        return area == (x2 - x1) * (y2 - y1);
    }
};

int main() {
    Solution ob;
    vector> v = {{1, 1, 3, 3}, {3, 1, 4, 2}, {3, 2, 4, 4}, {1, 3, 2, 4}, {2, 3, 3, 4}};
    cout << (ob.isRectangleCover(v));
}

ইনপুট

{{1, 1, 3, 3}, {3, 1, 4, 2}, {3, 2, 4, 4}, {1, 3, 2, 4}, {2, 3, 3, 4}}

আউটপুট

1
  1. C++-এ আয়তাকার এলাকা II (Rectangle Area II) সমাধান

  2. C++-এ আয়তক্ষেত্রের এলিয়া হিসাব

  3. C++-এ বাইনারি ট্রি নোডস ভ্যালিডেট করা

  4. C++-এ মিডপয়েন্ট ব্যবহার করে রেক্ট্যাঙ্গেলের কর্নার বের করা