Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ में आयत को न्यूनतम वर्गों से टाइल करना (Tiling a Rectangle with the Fewest Squares)


समस्या विवरण

एक n × m आकार का आयत दिया गया है। आयत को टाइल (ढकने) करने के लिए न्यूनतम पूर्णांक-भुजा वाले वर्गों (integer-sided squares) की संख्या ज्ञात करनी है।

उदाहरण

इनपुट: n = 2, m = 3

आउटपुट: 3

व्याख्या: तीन वर्गों की आवश्यकता होती है।

समाधान दृष्टिकोण (DFS + बैकट्रैकिंग + मेमोइजेशन)

  1. वर्तमान भरे हुए क्षेत्र को ऊंचाई सरणी h[1..n] द्वारा दर्शाएं।
  2. सबसे कम ऊंचाई वाली स्थिति pos ढूंढें।
  3. वहां रखे जा सकने वाले सबसे बड़े वर्ग को आज़माएं (घटते क्रम में)।
  4. वर्ग रखें, ऊंचाई सरणी अपडेट करें, पुनरावर्ती कॉल करें।
  5. स्थिति को एन्कोड करके मेमोइजेशन (कैशिंग) करें।
  6. प्रूनिंग: यदि वर्तमान गिनती ≥ सर्वश्रेष्ठ परिणाम, तो वापस लौटें।

कार्यकारी प्रोग्राम

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

class Solution {
public:
    map<long long, int> memo;
    int best = INT_MAX;
    
    void dfs(int n, int m, vector<int>& h, int cnt) {
        if (cnt >= best) return;
        
        bool full = true;
        int pos = -1, minH = INT_MAX;
        for (int i = 1; i <= n; i++) {
            if (h[i] < m) full = false;
            if (h[i] < minH) { minH = h[i]; pos = i; }
        }
        if (full) { best = min(best, cnt); return; }
        
        // स्थिति एन्कोडिंग
        long long key = 0, base = m + 1;
        for (int i = 1; i <= n; i++) {
            key += h[i] * base;
            base *= (m + 1);
        }
        if (memo.count(key) && memo[key] <= cnt) return;
        memo[key] = cnt;
        
        // अधिकतम संभव वर्ग आकार
        int end = pos;
        while (end + 1 <= n && h[end + 1] == h[pos] && (end + 1 - pos + 1 + minH) <= m)
            end++;
        
        for (int j = end; j >= pos; j--) {
            int sz = j - pos + 1;
            vector<int> next = h;
            for (int k = pos; k <= j; k++) next[k] += sz;
            dfs(n, m, next, cnt + 1);
        }
    }
    
    int tilingRectangle(int n, int m) {
        if (n == m) return 1;
        if (n > m) swap(n, m);
        vector<int> h(n + 1, 0);
        dfs(n, m, h, 0);
        return best;
    }
};

int main() {
    Solution ob;
    cout << ob.tilingRectangle(2, 3);
    return 0;
}

आउटपुट

3
  1. C++ में आयत में वर्गों की संख्या गिनना C++ में आयत में वर्गों की संख्या गिनना

    =B। लक्ष्य LxB आकार के आयत में समायोजित किए जा सकने वाले वर्गों की संख्या ढूंढना है। उपरोक्त आकृति 3x2 आकार के एक आयत को दर्शाती है। इसमें 2, 2x2 वर्ग और 6, 1x1 वर्ग हैं। कुल वर्ग = 6+2=8। LxB आकार के हर आयत में L*B संख्या के 1x1 वर्ग होते हैं। सबसे बड़े वर्ग BxB आकार के होते हैं। L=B=1 के लिए, वर

  1. C++ में आयत क्षेत्रफल गणना C++ में आयत क्षेत्रफल गणना

    मान लीजिए हम 2D तल में दो समकोणीय आयतों द्वारा कवर किए गए कुल क्षेत्रफल को ढूंढना चाहते हैं। प्रत्येक आयत को उसके निचले बाएं कोने और ऊपरी दाएं कोने द्वारा परिभाषित किया जाता है।हल करने के चरण= H या D <= F, तो(C - A) * (D - B) + (G - E) * (H - F) वापस करेंएक सरणी h परिभाषित करें, इसमें A, C, E, G डाल

  1. C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री

    मान लीजिए हमारे पास रूट पर रूटेड एक बाइनरी ट्री है, प्रत्येक नोड की गहराई रूट से सबसे छोटी दूरी है। यहां एक नोड सबसे गहरा है यदि इसकी गहराई पूरे ट्री में किसी भी नोड के बीच सबसे बड़ी संभव है। एक नोड का सबट्री वह नोड है, साथ ही उस नोड के सभी वंशजों का सेट। हमें सबसे बड़ी गहराई वाला नोड ढूंढना है जैसे