يتم إنشاء تسلسلات الأقواس الصحيحة مباشرة من الطريقة التي يتم بها الفحص - نحتاج فقط إلى إضافة أقواس جديدة دون الإخلال بالصحة. يتم ذلك عن طريق التكرار العودي. إذا كنت لا تعرفه - كن ... آه ، لا ، يمكنك محاولة الفهم من خلال قراءة المزيد. إليك نموذج رمز لنوع واحد من الأقواس:
نبسب ؛
# include & lt؛ vector & gt؛
# include & lt؛ iostream & gt؛
باستخدام span> مساحة الاسم span> std؛
int n؛ // نصف الطول span>
متجه & lt؛ char & gt؛ الجواب. // إجابتنا span>
باطل span> rec ( int الرصيد) {
إذا span> (ans.size () == 2 * n) { // إذا كان الأمر كذلك ، فنحن تم span>
لـ span> ( int i = 0؛ i & lt؛ 2 * n؛ i ++)
كوت & lt؛ & lt؛ الجواب [i] & lt؛ & lt؛ & quot؛ & quot؛ ؛
كوت & lt؛ & lt؛ & quot؛ \ n & quot؛ ؛
}
إذا span> (ans.size () + الرصيد + 2 & lt؛ = n * 2) { // تحقق ، نحن سوف نجعلها تغلق قوس الافتتاح الجديد span>
// الآن راقب يديك: لسنا بحاجة إلى إنشاء متجه منفصل لكل تسلسل span>
ans.push_back ( & # 39؛ (& # 39 ؛ )؛
rec (الرصيد + 1) ؛
ans.pop_back () ، // لفهم هذا ، يجب أن تكون على دراية بالتكرار. أولاً ، نضيف قوسًا إلى المتجه ، ثم ننفذ كل هذه الشفرة مرة أخرى. span>
// أي ، أضف قوسًا مرة أخرى ، إذا استطعنا. span>
// وسيحدث هذا حتى نبدأ في ترك العودية - أي حتى نصل إلى الطول المطلوب. span>
// ثم ستبدأ إزالة الأقواس. إذا فهمت هذا - أهنئك ، فأنت رائع. span>
}
إذا span> (الرصيد & gt؛ 0) { // إذا كان بإمكاننا إغلاق قوس ، فإننا نغلقه. span>
ans.push_back ( & # 39؛) & # 39 ؛ )؛
rec (الرصيد - 1) ؛
ans.pop_back () ،
}
}
int main ()
{
سينما & GT ؛ & GT. ن؛
rec (0) ؛
إرجاع span> 0؛
}
والآن وقت الصعوبات - سيتعين عليك كتابة الخوارزمية لعدة أنواع من الأقواس بنفسك! مهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاهاها!