华为机试在线训练-牛客网(36)火车进站

来源:互联网 发布:dior fix it 编辑:程序博客网 时间:2024/05/16 06:08


题目描述

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。


输入描述:

有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9。



输出描述:

输出以字典序从小到大排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample。


输入例子:
31 2 3

输出例子:
1 2 31 3 22 1 32 3 13 2 1

两个字:好题!

将全排列和栈的应用结合来考。可以先列出所有排列(全排列算法),依次判断是否为输入序列的出栈序列,即输入序列作为入栈序列,判断该排列是否为其一种可能的出栈序列。比如:3 1 2就不是1 2  3的一个出栈序列。难点在于判断一个排列是否是输入序列的出栈序列。

判断一个序列是否是入栈序列的出栈序列的基本思路为:每次入栈后都判断是否需要出栈,具体操作如下:

(1)对于输入序列,每次先入栈,后判断是否需要出栈,出栈条件:栈非空且栈顶元素与出栈序列当前所指元素相等。

(2)每出栈一次,指向出栈序列下一个元素。

(3)重复过程(1),直到输入序列遍历完成。

(4)遍历结束后,若栈空则true,否则false。

代码如下;

bool isPopOrder(int pushNum[],int n,vector<int> popNum){    stack<int> stk;    int j=0;    for(int i=0;i<n;i++)//依次把push中的数入栈    {        stk.push(pushNum[i]);        while( stk.size()!=0 && popNum[j]==stk.top())            //依次判断pop序列每个值是否与栈顶相等        {            stk.pop();            j++;        }    }    return stk.empty();}

判断出栈序列实现后,主函数就简单了。只需实现全排列算法对每个排列进行判断即可,可以直接调用STL的next_permutation()完成全排列,注意该函数的使用需要先排序才能列出所有排列,详见博客:《STL算法-排列算法》http://blog.csdn.net/hechao3225/article/details/54946510


完整AC的代码:

#include <iostream>#include <algorithm>#include <stack>using namespace std;bool isPopOrder(int pushNum[],int n,vector<int> popNum){    stack<int> stk;    int j=0;    for(int i=0;i<n;i++)//依次把push中的数入栈    {        stk.push(pushNum[i]);        while(stk.size()!=0 && popNum[j]==stk.top())            //依次判断pop序列每个值是否与栈顶相等        {            stk.pop();            j++;        }    }    return stk.empty();}int main(){    int n;    while(cin>>n){        int num;        int data[n];        vector<int > temp;        for(int i=0;i<n;i++){            cin>>num;            data[i]=num;            temp.push_back(num);        }        sort(temp.begin(),temp.end());        vector<vector<int>> vec_res;        do{            if(isPopOrder(data,n,temp))                vec_res.push_back(temp);        }while(next_permutation(temp.begin(),temp.end()));        sort(vec_res.begin(),vec_res.end());        for(auto e:vec_res){            int i=0;            for(;i<n-1;i++){                cout<<e[i]<<" ";            }            cout<<e[i]<<endl;        }    }    return 0;}






1 0