AcWing 火车进栈
Description
这里有n列火车将要进站再出站,但是,每列火车只有1节,那就是车头。
这n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。
也就是说这个火车站其实就相当于一个栈,每次可以让右侧头火车进栈,或者让栈顶火车出站。
现在请你按《字典序》输出前20种可能的出栈方案。
Input
- 输入一个整数n,代表火车数量。
Output
- 按照《字典序》输出前20种答案,每行一种,不要空格。
Data Size
- 1≤n≤20
Sample Input
3
Sample Output
123 132 213 231 321
题解:
- 搜索(用栈模拟)。
- 如果一上去题都不看就是无脑爆搜那就直接WA了
(我就是这样) - 注意,这个搜索是基于“栈“的性质的!
- 所以面对每一个状态,有下列两种选择:
- 把下一个数进栈
- 将栈顶弹出
- 那么经过2 * n次操作后,所以元素肯定都已经出栈了。
#include <iostream>
#include <cstdio>
#include <stack>
#define N 25
using namespace std;
int n, flag, cnt;
int a[N];
stack<int> stk;
void dfs(int step, int num)
{
if(flag) return;
if(step > 2 * n)
{
cnt++;
if(cnt == 20) flag = 1;
for(int i = 1; i <= 2 * n; i++)
if(a[i]) cout << a[i];
cout << endl;
return;
}
if(stk.size())
{
int t =stk.top();
a[step] = t;
stk.pop();
dfs(step + 1, num);
stk.push(t);
a[step] = 0;
}
if(num <= n)
{
stk.push(num);
dfs(step + 1, num + 1);
stk.pop();
}
}
int main()
{
cin >> n;
dfs(1, 1);
return 0;
}