描述 | |
---|---|
知识点 | 栈 |
运行时间限制 | 0M |
内存限制 | 0 |
输入 | 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。 |
输出 | 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。 |
样例输入 | 3 1 2 3 |
样例输出 | 1 2 3 1 3 2 2 1 3 2 3 1 3 2 1 |
解题思路:先根据火车编号进行全排列,再判断该全排列是否符合要求,也就还是判断出栈的顺序是否符合要求。
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
/* 判断该出栈序列,是否符合要求 */
bool isRight(int in[], int out[], int n)
{
bool ret = true;
stack<int> sta;
int index_out = 0, index_in = 0;
while(index_out < n)
{
while(index_in < n)
{
if(sta.empty())
{
sta.push(in[index_in]);
index_in++;
}
else if(sta.top() != out[index_out])
{
sta.push(in[index_in]);
index_in++;
}
else
{
break;
}
}
if(sta.top() == out[index_out])
{
sta.pop();
index_out++;
}
else
{
break;
}
}
if(sta.empty())
{
ret = true;
}
else
{
ret = false;
}
return ret;
}
/* 全排列 */
void perm(int in_train[],int a[], int k, int n)
{
int i = 0;
if(k == n)
{
/* 判断该序列是否符合要求 */
if(isRight(in_train,a,n) == true)
{
for(i = 0; i < n; i++)
{
if(i == 0)
{
cout << a[i];
}
else
{
cout << " " << a[i] ;
}
}
cout << endl;
}
}
else
{
for(i = k; i < n; i++)
{
swap(a[i],a[k]);
perm(in_train,a,k+1,n);
swap(a[i],a[k]);
}
}
}
int main()
{
int N = 0,i = 0;
/* 存放火车的编号 */
int data[10] = {0};
int data_bk[10] = {0};
cin >> N;
for(i = 0; i < N; i++)
{
cin >> data[i];
data_bk[i] = data[i];
}
perm(data_bk,data,0,N);
return 0;
}