只要前20个,且要字典序,那不就暴力dfs
字典序无非就决定了其出栈的顺序,那想想看一个数进栈之后是要等下一个数进来,下一个数先出还是自己先出呢,自己是1,下一个是2,肯定自己小先出才能保证字典序小咯,所以字典序小就是栈里有数先出就欧克啦
代码如下:
#include <bits/stdc++.h>
using namespace std;
int cnt = 20,n;
int state3;//未入栈的
stack<int> state2;//栈中的
vector<int> state1;//左边已经出栈的
void dfs()
{
if(!cnt) return ;
if(state1.size() == n){
for (auto x:state1) cout<<x; //够了就出来
cout<<endl;
cnt--;
return ;
}
if(!state2.empty()){ //有数出栈
int k = state2.top();
state1.push_back(k);
state2.pop();
dfs();
state1.pop_back();
state2.push(k);
}
if(state3 < n){ //添加数
state3++;
state2.push(state3);
dfs();
state3--;
state2.pop();
}
}
int main()
{
cin>>n;
dfs();
return 0;
}