样例通过 提交0分 求调
查看原帖
样例通过 提交0分 求调
794083
Z3k7223ios::sync楼主2023/12/15 13:57

记录

基本照第一篇题解写的,玄关感谢

#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;
}
2023/12/15 13:57
加载中...