zoukankan      html  css  js  c++  java
  • 华为OJ—火车进站(栈,字典排序)

    http://career-oj.huawei.com/exam/ShowSolution?method=SolutionApp&id=2282

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

    样例输入:

    3

    1 2 3

    样例输出:

    1 2 3
    1 3 2
    2 1 3
    2 3 1
    3 2 1




    解答:

      其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了。那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个、1个、2个……栈.size()个,然后把第K个入栈,再对于 K+1个同样实施这样的方法——这就是个递归了。

      出去了的保存在一个队列里面,没出站的保存在栈里面,最后一辆车处理完了递归结束并输出。

    代码:

     1 #include <iostream>
     2 #include <vector>
     3 #include <stack>
     4 
     5 using namespace std;
     6 
     7 #define DEBUG
     8 
     9 int n = 0;
    10 int* pArr = NULL;
    11 
    12 void handle(const int index, stack<int> s, vector<int> v)
    13 {
    14     //对于每一个待处理的数字,先处理栈里面的,再处理这个数字
    15     for (int i = s.size(); i >=0; i--)
    16     {
    17         //栈里面的数字可以出来 [0个, 全部],出来的就放到了vector里面待输出了
    18         stack<int> sTemp(s);
    19         vector<int>vTemp(v);
    20 
    21         //从栈里面出 i 个到队列里面去
    22         for (int j = 1; j <= i; j++)
    23         {
    24             int top = sTemp.top();
    25             sTemp.pop();
    26             vTemp.push_back(top);
    27         }
    28 
    29         //再处理这个,把它放到栈顶
    30         sTemp.push(pArr[index]);
    31 
    32         if (n - 1 == index)
    33         {
    34             //输出结果
    35             static bool isFirst = true;
    36             vector<int> vRes;
    37             if (!isFirst)
    38                 cout << endl;
    39 
    40             for (int i = 0; i < vTemp.size(); i++)
    41                 vRes.push_back(vTemp[i]);
    42 
    43             while (!sTemp.empty())
    44             {
    45                 int top = sTemp.top();
    46                 sTemp.pop();
    47                 vRes.push_back(top);
    48             }
    49             
    50             int i = 0;
    51             for (i = 0; i < vRes.size() - 1; i++)
    52                 cout << vRes[i] << " ";
    53             cout << vRes[i];
    54             isFirst = false;
    55         }
    56         else
    57         {
    58             //递归处理
    59             handle(index + 1, sTemp, vTemp);
    60         }
    61     }
    62 }
    63 
    64 int main(void)
    65 {
    66     cin >> n;
    67     pArr = new int[n];
    68 
    69     for (int i = 0; i < n; i++)
    70         cin >> pArr[i];
    71 
    72     stack<int> s;
    73     vector<int> v;
    74     handle(0, s, v);
    75 
    76     delete[] pArr;
    77 
    78 #ifdef DEBUG
    79     while (true)
    80         cin.get();
    81 #endif
    82 }
    View Code

    第35、36行的变量只是为了输出格式。




    总结:

      类似于这种的题目有时候只要根据它的情况模拟一下就知道解决思路了。

  • 相关阅读:
    通过internet网络唤醒主机的方法
    信用风险计量模型
    Vintage、滚动率、迁移率的应用
    (信贷风控十五)评分卡分数切分、授信额度与利率定价
    (信贷风控十)催收评分卡的介绍
    (信贷风控十六)组合评分卡模型
    (信贷风控十四)深度神经网络模型用于评分卡模型(理论)
    (十三)GBDT模型用于评分卡模型python实现
    (信贷风控九)行为评分卡模型python实现
    改变jupyter notebook的主题背景
  • 原文地址:https://www.cnblogs.com/jiayith/p/4414226.html
Copyright © 2011-2022 走看看