基本照第一篇题解写的,玄关感谢
#include <bits/stdc++.h>
using namespace std;
const int N = 20, STEP = 60;
int stk[4][100], t[4];
int n, lim;
int in[N];
struct Ans {
int a, b, c;
} ans[STEP];
void output(int step) {
for (int i = 1; i <= step; i++) {
char a1 = ans[i].a + 'a' - 1, a2 = ans[i].b + 'A', a3 = ans[i].c + 'A';
cout << a1 << " " << a2 << " " << a3 << endl;
}
}
inline void dfs(int x) { //step
if (stk[3][t[3]] != in[t[3]])
return;
if (lim - x + 1 < t[0] + t[1] + t[2])
return;
if (x > lim) {
if (t[0] + t[1] + t[2]) {
return;
} else {
output(x - 1);
exit(0);
}
}
for (int i = 0; i <= 2; i++) {
for (int j = i + 1; j <= 3 && t[i]; j++) {
int tot = stk[i][t[i]--];
ans[x] = {tot, i, j};
stk[j][++t[j]] = tot;
dfs(x + 1);
stk[i][++t[i]] = tot;
--t[j];
}
}
}
int main() {
cin >> n;
getchar();//读回车
for (int i = 1; i <= n; i++) {
in[i] = getchar() - 'a' + 1;
stk[0][++t[0]] = i;
}
for (int i = 1; i <= (n >> 1); i++) {
swap(in[i], in[n - i + 1]);
}
// for (int i = 1; i <= n; i++) {
// cout << in[i] << endl;
// }
for (lim = n; lim <= n * 3; lim++) {
dfs(1);
}
puts("NO");
return 0;
}