मान लीजिए हमारे पास n x m आकार का एक आयत है। हमें आयतों को टाइल करने वाले पूर्णांकों की पक्षीय वर्ग वस्तुओं की न्यूनतम संख्या ज्ञात करनी होगी।
इसलिए, यदि इनपुट n =2 और m =3 जैसा है, तो
तब आउटपुट 3 होगा, क्योंकि हमें तीन ब्लॉक चाहिए।
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -
-
एक नक्शा परिभाषित करें मी
-
रेस :=inf
-
फ़ंक्शन dfs() को परिभाषित करें, इसमें n, m, एक सरणी h, cnt,
लगेगा -
अगर cnt>=res, तो −
-
वापसी
-
-
पूर्ण:=सत्य
-
स्थिति :=-1, minH :=inf
-
इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -
-
यदि h[i]
-
पूर्ण है:=असत्य
-
-
यदि h[i]
-
मिनएच:=एच[i]
-
स्थिति :=मैं
-
-
-
यदि isFul गैर-शून्य है, तो -
-
रेस :=न्यूनतम रेस और सीएनटी
-
वापसी
-
-
कुंजी :=0
-
आधार :=एम + 1
-
इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -
-
कुंजी:=कुंजी + एच [i] * आधार
-
आधार:=आधार * (एम + 1)
-
-
यदि कुंजी s और s[key] <=cnt में है, तो -
-
वापसी
-
-
एस [कुंजी]:=सीएनटी
-
अंत:=स्थिति
-
जबकि (अंत + 1 <=n और h[end + 1] h[pos] और (end + 1 - pos + 1 + minH) के समान है
-
<=एम), करो -
-
(अंत में 1 से बढ़ाएं)
-
-
प्रारंभ करने के लिए j :=end, जब j>=pos, अपडेट करें (j को 1 से घटाएं), करें -
-
curH :=j - pos + 1
-
आकार n + 1 के आगे एक सरणी परिभाषित करें
-
इनिशियलाइज़ i :=1 के लिए, जब i <=n, अपडेट करें (i को 1 से बढ़ाएँ), करें -
-
अगला[i] :=h[i]
-
-
इनिशियलाइज़ k :=pos के लिए, जब k <=j, अपडेट करें (k को 1 से बढ़ाएँ), करें -
-
अगला [के]:=अगला [के] + वक्र
-
-
dfs(n, m, next, cnt + 1)
-
-
मुख्य विधि से निम्न कार्य करें -
-
यदि n, m के समान है, तो -
-
वापसी 1
-
-
अगर n> मी, तो
-
स्वैप (एन, एम)
-
-
आकार n + 1
. के एक सरणी h को परिभाषित करें -
dfs(n, m, h, 0)
-
रिटर्न रेस
आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: map<int, int> s; int res = INT_MAX; void dfs(int n, int m, vector<int> h, int cnt){ if (cnt >= res) return; bool isFull = true; int pos = -1, minH = INT_MAX; for (int i = 1; i <= n; i++) { if (h[i] < m) isFull = false; if (h[i] < minH) { minH = h[i]; pos = i; } } if (isFull) { res = min(res, cnt); return; } long key = 0; long base = m + 1; for (int i = 1; i <= n; i++) { key += h[i] * base; base *= m + 1; } if (s.find(key) != s.end() && s[key] <= cnt) return; s[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 curH = j - pos + 1; vector<int> next(n + 1); for (int i = 1; i <= n; i++) next[i] = h[i]; for (int k = pos; k <= j; k++) { next[k] += curH; } 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); dfs(n, m, h, 0); return res; } }; main(){ Solution ob; cout << (ob.tilingRectangle(2, 3)); }
इनपुट
2,3
आउटपुट
3