Penjanaan urutan kurungan yang betul mengikut terus daripada cara semakan dilakukan - kita hanya perlu menambah kurungan baharu tanpa melanggar ketepatan. Ini dilakukan dengan lelaran rekursif. Jika anda tidak mengenalinya - BE... ah, tidak, anda boleh cuba memahami dengan membaca lebih lanjut. Berikut ialah contoh kod untuk satu jenis kurungan:
#include <vector>
#include <iostream>
menggunakan ruang nama std;
int n; // Separuh panjang
vektor<char> ans; // Jawapan kami
kosong rec(int baki) {
jika (ans.size() == 2 * n) { // Jika ia berlaku, maka kita selesai
untuk (int i = 0; i < 2 * n; i++)
cout << ans[i] << " ";
cout << "\n";
}
jika (ans.size() + baki + 2 <= n * 2) { // Semak, kami Akan berjaya kami menutup pendakap pembukaan baharu
// Sekarang perhatikan tangan anda: kita tidak perlu membuat vektor berasingan untuk setiap jujukan
ans.push_back('(');
rec(baki + 1);
ans.pop_back(); // Untuk memahami perkara ini, anda perlu sedar tentang rekursi. Mula-mula, kami menambah kurungan pada vektor, dan kemudian kami melaksanakan semua kod ini sekali lagi.
// Iaitu, tambahkan kurungan sekali lagi, jika kita boleh.
// Dan ini akan berlaku sehingga kita mula meninggalkan rekursi - iaitu, sehingga kita mencapai panjang yang dikehendaki.
// Kemudian kurungan akan mula dialih keluar. Jika anda memahami perkara ini - saya mengucapkan tahniah kepada anda, anda hebat.
}
jika (baki > 0) { // Jika kami boleh menutup kurungan, kami menutupnya.
ans.push_back(')');
rec(baki - 1);
ans.pop_back();
}
}
int main()
{
cin>> n;
rec(0);
kembali 0;
}
Dan kini masa kesukaran - anda perlu menulis algoritma untuk beberapa jenis kurungan SENDIRI! Muahahahahahahahahahahah!