典型的dfs问题。
分析解决dfs这类问题的关键所在是:
1、(层)确定递归的层是什么:比如在本问题中,递归的层就是将要进栈的车的序号,dfs(x)表示第x个车等待入栈
2、(类)确定分类:在当前位置和状态,所有可能出现的情况,一般是两种:比如当前位置选或者不选。在本题中,就是分成栈顶出栈(依旧在这一层)和元素入栈(进入下一层)。同时,要记得回溯。
3、(停)确定停止条件:在层数达到最后一层确定如何停止(到达最后一层,只输出20个答案)
#include <cstdio>
#include <iostream>
using namespace std;
const int N = 26;
int n; //n为列车数量
int st[N]; //所有元素入栈后,栈中的元素
int ans[N]; //所有元素入栈后,已经出栈的元素序列
int top = 0;
int t = 0;
int num = 0;
void z(int x) //x表示第x个元素等待入栈
{
if (x == n + 1) { //遍历到最后一位
if (++num > 20) return; //数目大于20,返回
for (int i = 1; i <= t; i++) printf("%d", ans[i]); //输出 (所有元素入栈后,已经出栈的元素序列 )
for (int i = top; i ; i -- ) printf("%d", st[i]); //输出 (所有元素入栈后,栈中的元素 ),从栈顶到栈底
cout << endl;
return;
}
//两种可能性:1、栈顶元素出栈;2、元素入栈
if (top) { //1、栈顶元素出栈;
//如果栈顶不为空,即栈中没有元素
ans[++t] = st[top--]; // 出栈的元素,多一个栈顶元素
z(x); //还是遍历这一位
st[++top] = ans[t--]; //回溯
}
st[++top] = x; //栈顶加一个元素
z(x + 1); //遍历下一个
--top; //回溯
}
int main()
{
cin >> n;
z(1); //输出结果,从列车1开始
return 0;
}