(合理数目 是 卡特兰数 C2n n / (n+1))
例如 abc 有5种合理的顺序, 打印如下
cba
bca
bac
acb
abc
abcd 有 14中合理的顺序,打印如下
dcba
cdba
cbda
cbad
bdca
bcda
bcad
badc
bacd
adcb
acdb
acbd
abdc
abcd
当时笔试没写好,时间有点紧,先把代码思路整理如下(?,应该是对的,还要仔细验证下)
思路
。。。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <cmath>
#include <iostream>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <list>
#include <sstream>
#include <algorithm>
#include <unordered_map>
#include <unordered_set>
using namespace std;
struct data{
string tmp;
stack<char> sta;
int nextIndex;
};
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
string s;
cin >> s;
int len = s.size();
data dt;
dt.nextIndex = 1;
dt.sta.push(s[0]);
dt.tmp = "";
queue<data> que;
que.push(dt);
while (!que.empty())
{
data d = que.front();
que.pop();
int nt = d.nextIndex;
if (d.nextIndex == len)
{
cout << d.tmp;
while (!d.sta.empty())
{
cout << d.sta.top();
d.sta.pop();
}
cout << endl;
}
else{
// 1
data d1 = d;
d1.sta.push(s[nt]);
d1.nextIndex = nt + 1;
que.push(d1);
// 2
if (!d.sta.empty())
{
stack<char> statmp = d.sta;
string tmp = "";
while (!statmp.empty())
{
char c = statmp.top();
statmp.pop();
tmp += c;
data d2;
d2.sta = statmp;
d2.tmp = d.tmp + tmp; //
d2.sta.push(s[nt]);
d2.nextIndex = nt + 1;
que.push(d2);
}
}
}
}
return 0;
}