java成长日记(13)

  今天带来的是我数据结构实验二的两道题,这两道题都与栈与队列息息相关。现在先放上第一题:

  

7-1 列车厢调度

分数 300

全屏浏览题目

切换布局

作者 周强

单位 青岛大学

        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?

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

先把代码贴上:

import java.util.Stack;
import java.util.Scanner;

public class exper2has1 {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        Stack<Character> one=new Stack<>();
        Stack<Character> two=new Stack<>();
        Stack<Character> three=new Stack<>();
        int[]arr=new int[100];
        int t=0;
        String a=scanner.nextLine();
        String b=scanner.nextLine();
        for(int i=a.length()-1 ; i>= 0; i--)
        {
            one.push(a.charAt(i));
        }
        for(int i=b.length()-1 ; i>= 0 ; i--){
            two.push(b.charAt(i));
        }
        int flag=0;
        while(!two.empty())
        {
            if(!one.empty() && one.peek() == two.peek())
            {
                one.pop();
                two.pop();
                arr[t++] = 1;
            }
            else if(!three.empty() && three.peek() == two.peek())
            {
                three.pop();
                two.pop();
                arr[t++] = 3;
            }
            else if(one.empty() && !two.empty() && three.peek() != two.peek())
            {
                flag = 1;
                break;
            }
            else
            {
                three.push(one.peek());
                one.pop();
                arr[t++] = 2;
            }
        }
        if(flag==1)
            System.out.println("Are you kidding me?");
        else
        {
            int i = 0;
            while (arr[i] != 0)
            {
                if(arr[i] == 1)
                    System.out.println("1->2");
                else if(arr[i] == 2)
                    System.out.println("1->3");
                else if(arr[i] == 3)
                    System.out.println("3->2");
                i++;
            }
        }

    }
}

  讲讲实现的思路:首先依题意设置三个“轨道”,即栈。之后把input的字符串和output的字符串分别存在one栈和two栈之中。然后我建立了一个数组,用来存放指令数(当指令数为1时输出1->2;当指令数为2时输出1->3;当指令数为1时输出3->2;当然输出在循环结束后才输出了)之后开启循环条件(即当two栈不为空时),如果one栈不是空的且one的栈顶元素与two的栈顶元素相等,就同时拿到这两个元素,之后把指令数1存到数组之中;如果thre栈不是空的且three的栈顶元素与two的栈顶元素相等,就同时拿到这两个元素,之后把指令数3存到数组之中;如果one栈是空的且two栈不是空的且three的栈顶元素与two的栈顶元素不等(即列车全在3轨道聚着的时候),这时候output序列是不存在的,所以把标志flag定义为1,并退出循环;剩下的条件就是用来存放指令数2的。之后依据flag执行输出,其为1时输出“Are you kidding me?”,否则按顺序输出列车操作顺序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值