चेक किए जाने के तरीके से सही ब्रैकेट अनुक्रमों की पीढ़ी सीधे होती है - हमें शुद्धता का उल्लंघन किए बिना नए ब्रैकेट जोड़ने की जरूरत है। यह पुनरावर्ती पुनरावृत्ति द्वारा किया जाता है। अगर आप उसे नहीं जानते - बीई... आह, नहीं, आप आगे पढ़कर समझने की कोशिश कर सकते हैं। यहाँ एक प्रकार के कोष्ठकों के लिए एक कोड नमूना दिया गया है:
<पूर्व शैली = "मार्जिन-बाएं: 0 पीएक्स; मार्जिन-दाएं: 0 पीएक्स">
#include <vector>
#include <iostream>
उपयोग नामस्थान एसटीडी;
int n; // आधी लंबाई
वेक्टर<char> उत्तर; // हमारा जवाब
void rec(int बैलेंस) {
if (ans.size() == 2 * n) { // अगर ऐसा होता है, तो हम किया < /span>
for (int i = 0; i < 2 * n; i++)
cout << उत्तर [मैं] << " ";
cout << "\n";
}
if (ans.size() + balance + 2 <= n * 2) { // जांचें, हम हम नए ओपनिंग ब्रेस को बंद कर देंगे
// अब अपने हाथों को देखें: हमें प्रत्येक अनुक्रम के लिए एक अलग वेक्टर बनाने की आवश्यकता नहीं है
ans.push_back('(');
आरईसी (बैलेंस + 1);
उत्तर.पॉप_बैक (); // इसे समझने के लिए, आपको रिकर्सन के बारे में पता होना चाहिए। सबसे पहले, हम वेक्टर में एक कोष्ठक जोड़ते हैं, और फिर हम इस सभी कोड को फिर से निष्पादित करते हैं। अवधि>
// यानी, यदि हम कर सकते हैं, तो फिर से कोष्ठक जोड़ें। अवधि>
// और यह तब तक होगा जब तक हम रिकर्सन को छोड़ना शुरू नहीं करते - यानी, जब तक हम वांछित लंबाई तक नहीं पहुंच जाते। अवधि>
// इसके बाद ब्रैकेट हटना शुरू हो जाएंगे। यदि आप इसे समझते हैं - मैं आपको बधाई देता हूं, आप बहुत अच्छे हैं। अवधि>
}
if (balance > 0) { // अगर हम किसी ब्रैकेट को बंद कर सकते हैं, तो हम उसे बंद कर देते हैं। अवधि>
ans.push_back(')');
आरईसी (बैलेंस - 1);
उत्तर.पॉप_बैक ();
}
}
int main()
{
सिने>> एन;
आरईसी (0);
रिटर्न 0;
}
पूर्व>
और अब कठिनाइयों का समय - आपको कई प्रकार के कोष्ठकों के लिए एल्गोरिथम स्वयं लिखना होगा! मुहाहाहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहहह!