题目
编号为1,2,3,4的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?如果有n列火车通过调度站,请设计一个算法,输出所有可能的调度结果。
分析
栈具有先进后出、后进先出的特点,任何一个调度结果应该是1,2,3,4全排列中的一个元素。由于进栈的顺序是由小到大的,所以出栈序列应该满足以下条件:对于序列中的任何一个数其后面所有比它小的数应该是倒序的,例如4321是一个有效的出栈序列,1423不是一个有效的出栈结果(4后面比它小的两个数2,3不是倒序)。据此,本题可以通过算法产生n个数的全排列,然后将满足出栈规则的序列输出。
代码
#include <iostream>
#include <algorithm>
using namespace std;
int a[105];
int n;
// 判断是否符合出栈顺序
bool judge()
{
bool flag = true;
int b[2];
for (int i = 1; i <= n; i++)
{
int = 0;
for (int j = i + 1; j <= n && flag; j++)
{
if (a[i] > a[j])
{
if (k == 0)
{
b[k++] = a[j];
}
else
{
if (a[j] > b[0])
{
flag = false;
}
else
{
b[0] = a[j];
}
}
}
}
}
return flag;
}
// 产生全排列
void dfs(int step)
{
if (step == n && judge())
{
for (int i = 1; i <= n; i++)
{
cout << a[i] << " ";
}
cout << endl;
return;
}
for (int i = step; i <= n; i++)
{
swap(a[i], a[step]);
dfs(step + 1);
swap(a[i], a[step]);
}
}
int main()
{
cin >> n;
// 初始化
for (int i = 1; i <= n; i++)
{
a[i] = i;
}
dfs(1);
return 0;
}