zoukankan      html  css  js  c++  java
  • pta 习题集5-19 列车厢调度

           1  ======   <--移动方向
             /
     3 =====  
             
            2  ======   -->移动方向
    

    大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧)。今天,我们就来实际操作一下列车厢的调度。对照上方的ASCII字符图,问题描述如下:

    有三条平行的列车轨道(1、2、3)以及1-3和2-3两段连接轨道。现有一列车厢停在1号轨道上,请利用两条连接轨道以及3号轨道,将车厢按照要求的顺序转移到2号轨道。规则是:

    • 每次转移1节车厢;
    • 处在1号轨道的车厢要么经过1-3连接道进入3号轨道(该操作记为"1->3"),要么经过两条连接轨道直接进入2号轨道(该操作记为"1->2");
    • 一旦车厢进入2号轨道,就不可以再移出该轨道;
    • 处在3号轨道的车厢,只能经过2-3连接道进入2号轨道(该操作记为"3->2");
    • 显然,任何车厢不能穿过、跨越或绕过其它车厢进行移动。

    对于给定的1号停车顺序,如果经过调度能够实现2号轨道要求的顺序,则给出操作序列;如果不能,就反问用户 Are(你) you(是) kidding(凯丁) me(么)?

    输入格式:

    两行由大写字母组成的非空字符串,第一行表示停在1号轨道上的车厢从左到右的顺序,第二行表示要求车厢停到2号轨道的进道顺序(输入样例1中第二行CBA表示车厢在2号轨道的停放从左到右是ABC,因为C最先进入,所以在最右边)。两行字符串长度相同且不超过26(因为只有26个大写字母),每个字母表示一节车厢。题目保证同一行内的字母不重复且两行的字母集相同。

    输出格式:

    如果能够成功调度,给出最短的操作序列,每个操作占一行。所谓“最短”,即如果1->2可以完成的调度,就不要通过1->3和3->2来实现。如果不能调度,输出 "Are you kidding me?"

    输入样例1:

    ABC
    CBA
    

    输出样例1:

    1->3
    1->3
    1->2
    3->2
    3->2
    

    输入样例2:

    ABC
    CAB
    

    输出样例2:

    Are you kidding me?
    用栈模拟即可
    #include <iostream>
    #include <string.h>
    #include <math.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <algorithm>
    #include <stack>
    #include <map>
    
    using namespace std;
    char a[105];
    char b[105];
    char c[105];
    int aa;
    int bb;
    int cc;
    char s[35];
    char e[35];
    string res[1005];
    map<char,int> m;
    int main()
    {
        scanf("%s",s);
        scanf("%s",e);
        int len=strlen(s);
        aa=0;bb=0;cc=0;
        for(int i=len-1;i>=0;i--)
        {
            a[++aa]=s[i];
        }
        for(int i=0;e[i];i++)
        {
            m[e[i]]=i+1;
        }
        int tag=0;
        int ans=1;
        int tot=0;
        while(tag<len)
        {
            if(m[a[aa]]==cc+1)
            {
                aa--;
                res[tot++]="1->2";
                cc++;
                tag++;
            }
            else if(m[b[bb]]==cc+1)
            {
                bb--;
                res[tot++]="3->2";
                cc++;
                tag++;
            }
            else
            {
                if(aa==0)
                {
                    ans=0;
                    break;
                }
                res[tot++]="1->3";
                b[++bb]=a[aa--];
            }
        }
        if(!ans)
            printf("Are you kidding me?
    ");
        else
        {
            for(int i=0;i<tot;i++)
                cout<<res[i]<<endl;
        }
        return 0;
        
    }


  • 相关阅读:
    2016.10.15先占坑
    2016.10.11先占坑
    2016.10.13先占坑
    2016.10.7先占坑
    main()里面为什么要放String[] args
    对于一个给定的正整数 n ,请你找出一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。
    求两个数的最大公约数的三种算法总结
    C++
    Dev-c5.11的使用
    客户端和服务器端的交互(未完待续)
  • 原文地址:https://www.cnblogs.com/dacc123/p/8228545.html
Copyright © 2011-2022 走看看