码迷,mamicode.com
首页 > 其他好文 > 详细

火车进站

时间:2017-01-17 14:00:27      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:class   换行   clu   sig   ios   min   table   let   iostream   

描述

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

知识点
运行时间限制 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

 

隐含条件,这个题目中的火车站是个栈,前面的没出站,后面的来了的话,就把前面的堵在里面了。

仔细思考几个回合,即可发现其中规律。

本题用dfs解决,代码如下:

#include<iostream>
#include<stack>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;

void display(vector<int> arr)
{
    for(unsigned int i=0; i<arr.size()-1; i++)
    {
        cout<<arr[i]<<‘ ‘;
    }
    cout<<arr[arr.size()-1]<<endl;
}

bool comp12(vector<int> v1, vector<int> v2)
{
    int n= v1.size();
    for(int i=0; i<n; i++)
    {
        if(v1[i]!=v2[i])
        {
            return v1[i]<v2[i];
        }
    }
    return true;
}

void solve(int count, int *input, int N, stack<int> &stk, vector<int> &arr, vector<vector<int> > &arrs)
{
    if(count==N-1)
    {
        //the last
        arr.push_back(input[count]);

        int stksz = stk.size();
        while(!stk.empty())
        {
            int tmp = stk.top();
            stk.pop();
            arr.push_back(tmp);
        }


        arrs.push_back(arr);



        for(int i=0; i<stksz; i++)
        {
            int tmp = arr.back();
            stk.push(tmp);
            arr.pop_back();
        }
        arr.pop_back();//pop the last
    }
    else
    {
        stk.push(input[count]);
        int stksize = stk.size();
        //cout<<"size"<<stksize<<endl;
        for(int i=0; i<=stksize; i++)
        {
            //cout<<"x"<<i<<endl;
            for(int j=0; j<i; j++)
            {
                int tmp = stk.top();
                //cout<<"top"<<tmp<<endl;
                stk.pop();
                arr.push_back(tmp);
            }
            solve(count+1,  input ,N,stk, arr, arrs);
            for(int j=0; j<i; j++)
            {
                int tmp = arr.back();
                stk.push(tmp);
                arr.pop_back();
            }
        }
        stk.pop();
    }
}

int main()
{
    int N;
    cin>>N;
    int *input;
    input = new int [N];

    for(int i=0; i<N; i++)
    {
        cin>>input[i];
    }

    int count = 0;
    stack<int> stk;
    vector<int> arr;
    vector<vector<int> > arrs;
    solve(count, input, N, stk, arr, arrs);

    sort(arrs.begin(), arrs.end(), comp12);

    for(unsigned int i=0; i<arrs.size(); i++)
    {
        display(arrs[i]);
    }

    delete [] input;

    return 0;
}

  

火车进站

标签:class   换行   clu   sig   ios   min   table   let   iostream   

原文地址:http://www.cnblogs.com/hardsoftware/p/6292617.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!