关闭

[华为机试练习题]13.火车进站

标签: 华为机试练习题
4398人阅读 评论(4) 收藏 举报
分类:

题目

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

题目类别:    栈 
难度:  高级 
运行时间限制: 10Sec
内存限制:   128MByte
阶段:  入职前练习 
输入:  
有多组测试用例,每一组第一行输入一个正整数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

思路

1、若n=1那么就一种排列方式。
2、n>1时先求出n-1的出栈顺序,再分开将n插入n-1之前,n-1之后和每一个n-1之后的每一个数!

代码

/*---------------------------------------
*   日期:2015-06-30
*   作者:SJF0115
*   题目:火车进站
*   来源:华为上机
-----------------------------------------*/
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;

void helper(string &inTrain,vector<string> &outTrain,int index){
    if(index == inTrain.size()){
        return;
    }//if
    if(index == 0){
        string outNum("");
        outNum += inTrain[index];
        outTrain.push_back(outNum);
    }//if
    else{
        vector<string> newOutTrain;
        // 出站序列
        int size = outTrain.size();
        // 第index辆火车进站
        for(int i = 0;i < size;++i){
            // 第i个出站序列
            int count = outTrain[i].size();
            // 寻找前一个进站的火车下标
            int targetIndex;
            for(int j = 0;j < count;++j){
                if(inTrain[index-1] == outTrain[i][j]){
                    targetIndex = j;
                    break;
                }//if
            }//for
            string tmp(outTrain[i]);
            for(int j = targetIndex;j <= count;++j){
                tmp.insert(tmp.begin()+j,inTrain[index]);
                newOutTrain.push_back(tmp);
                tmp.erase(tmp.begin()+j);
            }//for
        }//for
        swap(outTrain,newOutTrain);
    }//else
    helper(inTrain,outTrain,index+1);
}

vector<string> TrainLeft(string inTrain){
    vector<string> result;
    int size = inTrain.size();
    if(size <= 0){
        result;
    }//if
    helper(inTrain,result,0);
    sort(result.begin(),result.end());
    return result;
}

int main(){
    int n;
    //freopen("C:\\Users\\Administrator\\Desktop\\c++.txt","r",stdin);
    while(cin>>n){
        string train("");
        int num;
        for(int i = 1;i <= n;++i){
            cin>>num;
            train += num + '0';
        }//for
        vector<string> trainNum = TrainLeft(train);
        // 输出
        int size = trainNum.size();
        for(int i = 0;i < size;++i){
            int count = trainNum[i].size();
            for(int j = 0;j < count;++j){
                if(j == 0){
                    cout<<trainNum[i][j];
                }//if
                else{
                    cout<<" "<<trainNum[i][j];
                }//else
            }//for
            cout<<endl;
        }//for
    }//while
    return 0;
}
3
0
查看评论

HDOJ acm 1022 火车进站出站(栈系列)

#include #include #include using namespace std; int main(){ int n; while (cin >> n) { bool flag = false; char* pin = new char[5*n]; ...
  • normol
  • normol
  • 2016-10-10 20:41
  • 1181

用栈的思想分析火车进站出站问题

编号为1,2,3,4 的四列火车通过一个栈式的列车调度站,可能得到的调度结果有哪些?如果 有n 列火车通过调度站,请设计一个算法,输出所有可能的调度结果。 【答】: 解题思路:栈具有先进后出、后进先出的特点,因此,任何一个调度结果应该是1 ,2 ,3 ,4 全排列中的一个元素。由于进栈的...
  • gubojun123
  • gubojun123
  • 2012-10-02 12:39
  • 9016

杭电ACM HDU 2674 N!Again

N!Again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2395  ...
  • gubojun123
  • gubojun123
  • 2013-05-26 23:12
  • 1350

火车进站问题,堆栈的使用

火车站问题,车站铁路如图所示。 每辆火车都从A方向驶入车站,再从B方向驶出车站,同时它的车厢可以进行某种形式的重新组合。假设从A方向驶来的火车有N节车厢(N≤1000),分别按顺序编号为1,2,…,N。负责车厢调度的工作人员需要知道能否使它以A1,A2,…,An的顺序从B方向驶出。 代码如下
  • hccgk
  • hccgk
  • 2015-07-23 12:25
  • 2313

hdu1022火车进站(有关栈的基本问题)

hdu1022 很简单的栈的使用,第一次涉及到 栈的头文件 来列举一下这道题里面用到的有关栈的命令 stacktrain :构建一个数据类型是char的栈,然后这个栈的名字叫train train.empty():判断栈train是不是为空,是空就返回1,非空就返回0. train.pus...
  • binbinlinlin2010
  • binbinlinlin2010
  • 2014-08-06 16:00
  • 753

C++ HOJ 火车进站

火车进站是给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号。要求以字典序排序输出火车出站的序列号。本文将讲解全排序思路、模拟堆栈方法与深度优先检索思路,STL思路,并在文末给出三组源码实现。
  • u013630349
  • u013630349
  • 2015-07-20 14:41
  • 1347

栈的应用——火车进站出站问题

问题: 某城市有一个火车站,铁轨铺设如下图所示。有n节车厢从A方向驶入车站,按照进站顺序编号为1~n。你的任务是输出所有可能的出站序列。例如,出站顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。 为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于...
  • yj3254
  • yj3254
  • 2015-02-10 19:20
  • 1064

火车进站出站问题

火车编号为:1~9,且不重复。 如:编号分别为“1”、“2”、“3”、“4”、“5”的5个火车顺序进站,那么进站序列为“12345”,全部进站后再顺序出站,则出站序列为“54321”,如果先进1,2,然后2出站,然后1出站,然后再3进站、出站,4进站、出站,5进站、出站,那么出站序列就...
  • conanswp
  • conanswp
  • 2014-02-26 20:27
  • 7439

栈之火车进站和出站

Problem Description As the new term comes, the Ignatius Train Station is very busy nowadays. A lot of student want to get back to school by train(bec...
  • l55iuming
  • l55iuming
  • 2015-05-13 16:47
  • 320

c语言考试中 火车进出站的问题解法是什么

选C1进1出 2进3进4进(2在最里面) 4出3出 5进6进7进(2和5在最里面) 7出 6出|||应该选c1进1出 2进3进4进 4出 3出 5进6进7进 7出 6出答案补充车站只能出一辆车 所以在外面的车要先出来 里面的车才可以出来的
  • bugrnm
  • bugrnm
  • 2008-10-20 09:21
  • 665
    个人资料
    • 访问:1512073次
    • 积分:22551
    • 等级:
    • 排名:第378名
    • 原创:624篇
    • 转载:133篇
    • 译文:60篇
    • 评论:189条
    博客专栏
    文章分类
    最新评论