栈:火车进站

题目描述

这里有n列火车将要进站再出站……

但是,每列火车只有1节---那就是车头……

描述

有n列火车按1到n的顺序从东方左转进站,这个车站是南北方向的,它虽然无限长,只可惜是一个死胡同,而且站台只有一条股道,火车只能倒着从西方出去,而且每列火车必须进站,先进后出。

(某生:不就是个栈吗?每次可以让右侧头火车进栈,或者让栈顶火车出站?

老师:闭嘴!)

就像这样:

出站<——-    <——进站

|车|

|站|

|__|

现在请你按《字典序》输出前20种可能的出栈方案。

输入

一个整数 n<=20

输出

按照《字典序》输出前20种答案,每行一种,不要空格

样例输入

3

样例输出

123
132
213
231
321

全排列,然后模拟栈取前20,所以不会超时

#include<bits/stdc++.h>
#define long long ll
using namespace std;
int n,num=0,a[200],book[200];//a chu 123 ru
int st[200];
int vt[200];
int top=0;
void Out(int a)    //输出外挂
{
if(a>9) Out(a/10);
putchar(a%10+‘0‘);
}
bool suit()
{
    int j=0,top=0;
    for(int i=1;i<=n;i++){
        if(a[j]==i){
            vt[j]=a[j];
            j++;
        }
        else {
            st[++top]=i;
        }
        while(top!=0&&st[top]==a[j]){
            vt[j]=a[j];
            top--;
            j++;
        }
    }
    for(int i=0;i<n;i++){
        if(vt[i]!=a[i]) return 0;
    }
    return 1;
}
void dfs(int step)
{
    if(num==20) return;
    if(step==n&&num<20){
        if(suit()){
            num++;
            for(int i=0;i<n;i++){
               Out(a[i]);
            }
            puts(" ");
        }
        return;
    }
    for(int i=1;i<=n;i++){
        if(book[i]==0){
        book[i]=1;
        a[step]=i;
        dfs(step+1);
        book[i]=0;
        a[step]=0;
        }
    }
    return ;
}
int main()
{
    scanf("%d",&n);
    dfs(0);
    return 0;
}

火车进站

#include<bits/stdc++.h>
using namespace std;
int s[100];
int n,sum;
vector<int>p;
void fun(int x,int num)
{
    s[x]=1;
    if(x!=0)
    p.push_back(x);
    if(num==n){
        for(int i=0;i<p.size();i++){
            if(i==0) printf("%d",p[i]);
            else printf(" %d",p[i]);
        }
        printf("\n");
    }
    for(int i=1;i<=n;i++){
        if(!s[i]){
            fun(i,num+1);
            s[i]=0;
            p.pop_back();
        }
    }
}
int main()
{
    scanf("%d",&n);
    fun(0,0);
    return 0;
}

全排列递归

原文地址:https://www.cnblogs.com/smallocean/p/9296942.html

时间: 2024-10-03 17:52:37

栈:火车进站的相关文章

华为OJ—火车进站(栈,字典排序)

给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号.其实也就是输出所有可能的出栈序列. 样例输入: 3 1 2 3 样例输出: 1 2 31 3 22 1 32 3 13 2 1 解答: 其实核心就是一个栈,对于第K个数,在第K个数进栈之前,前面的 K-1 个数要么全部出去了,要么都在栈里面,要么部分在栈里面部分出去了.那么可以假想,在第K个数入栈之前,依次从栈里面出去 0个.1个.2个--栈.si

栈之火车进站和出站

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(because the trains in the Ignatius Train Station is the fastest all over the world ^v^). But here comes

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

题目 描述: 给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列号. 题目类别: 栈 难度: 高级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 有多组测试用例,每一组第一行输入一个正整数N(0<N<10),第二行包括N个正整数,范围为1到9. 输出: 输出以字典序排序的火车出站序列号,每个编号以空格隔开,每个输出序列换行,具体见sample. 样例

全排列——火车进站问题(华为OJ)

今天发现一个非常好用的函数next_permutation(),利用这个函数这以很容易的列出一组数据的所有排列组合. 利用全部排列解决了火车进站问题,下面是题目和源码: 题目:给定一个正整数N代表火车数量,0 #include<vector> #include<stack> #include<string> #include<iostream> #include<algorithm> using namespace std; //////////

C++ HOJ 火车进站

[问题描写叙述] 给定一个正整数N代表火车数量.0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号. 要求以字典序排序输出火车出站的序列号. 输入: 有多组測试用例,每一组第一行输入一个正整数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 [

CodeVS3958 火车进站

3958 火车进站 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 火车站内往往设有一些主干线分叉出去的铁路支路,供火车停靠,以便上下客或装载货物.铁路支路有一定长度:火车也有一定的长度,且每列火车的长度相等. 假 设某东西向的铁路上,有一小站.该站只有一条铁路支路可供火车停靠,并且该铁路支路最多能容纳M 辆火车.为了火车行驶的通畅,该站只允许火车自东方进站,自西方出站,且先进站的火车必须先出站,否则,站内火车将发生堵塞.该

(hdu)1022 Train Problem I 火车进站问题

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1022 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(because the trains in the Ignatius Train Stati

火车进站问题

import java.util.EmptyStackException;import java.util.LinkedList;import java.util.Queue;import java.util.Scanner;import java.util.Stack;public class H06 { /** * @return * @给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列, * 一共N辆火车,每辆火车以数字1-9编号. * 要求以字典序排序输出火车出站的序

华为机试题 火车进站

描述:给定一个正整数N代表火车数量,0<N<10,接下来输入火车入站的序列,一共N辆火车,每辆火车以数字1-9编号.要求以字典序排序输出火车出站的序列 输入: 有多组测试用例,每一组第一行输入一个正整数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 思路:先对输入序列进行字