火车调度

题目


题目描述:

粗心的塔学长现在是火车站的调度员,看看现在的惨状吧,列车车厢的顺序竟然完全是乱的!为避免塔学长登上明天的UC头条,车站划分给塔塔一段如图所示的铁路,你能帮助塔塔把车厢的顺序调整好吗?

其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。

列车由编号依次为{1, 2, ..., n}的n节车厢组成。塔塔希望知道,按照以上交通规则,这些车厢能否以{a1, a2, ..., an}的次序,重新排列后从B端驶出。如果可行,应该以怎样的次序操作?

输入:

共两行。 
第一行为两个整数n,m。 
第二行为以空格分隔的n个整数,保证为{1, 2, …, n}的一个排列,表示待判断可行性的驶出序列{a1,a2,…,an}。

输出:
若驶出序列可行,则输出操作序列,其中push表示车厢从A进入S,pop表示车厢从S进入B,每个操作占一行。
若不可行,则输出“震惊!昨天小汤河火车站竟然。。。”。
样例输入
5 2
1 2 3 5 4
样例输出
push
pop
push
pop
push
pop
push
push
pop
pop


思路


这就是一个栈的程序实现问题。

用队列来储存输出的顺序。


代码


import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
    	Scanner scan=new Scanner(System.in);
    	ArrayList<String> queue=new ArrayList();
    	LinkedList<Integer> temp=new LinkedList();
    	LinkedList<Integer> stack_begin=new LinkedList();
    	String out="pop";
    	String in="push";
    	String output="震惊!昨天小汤河火车站竟然。。。";
    	int n=scan.nextInt();
    	int m=scan.nextInt();
    	int[] end=new int[n];
    	for(int i=0;i<n;i++) {
    		end[i]=scan.nextInt();
    	}
    	for(int i=1;i<=n;i++) {
    		stack_begin.add(i);
    	}
    	int count=0;
    	int a=-1;
    	boolean isok = true;
    	for(int i=0;i<n;i++) {
    		if(temp.isEmpty()) {
    			a=stack_begin.getFirst();
    			while(a!=end[i]) {                //A不等于B 入临时栈
    				temp.add(stack_begin.removeFirst());
    				queue.add(in);
    				if(temp.size()>m) {        //中间的临时栈爆了
    					isok=false;
    					break;
    				}
    				if(!stack_begin.isEmpty()) {
        				a=stack_begin.getFirst();}
        				else {
        					isok=false;break;
        				}
    			}
    			if(a==end[i]) {
    				if(temp.size()==m) {    //临时栈满了 A中元素无法进入B
    					isok=false;break;
    				}else {                //从A直接到B
    					stack_begin.removeFirst();
    					queue.add(in);
    					queue.add(out);
    				}
    			}else {
    				isok=false;
    				break;
    			}
    		}else {
    			if(temp.getLast()==end[i]) {
    			temp.removeLast();
    			queue.add(out);
    			}else {
    				a=stack_begin.getFirst();
        			while(a!=end[i]) {
        				temp.add(stack_begin.removeFirst());
        				queue.add(in);
        				if(temp.size()>m) {
        					isok=false;
        					break;
        				}
        				if(!stack_begin.isEmpty()) {
        				a=stack_begin.getFirst();}
        				else {
        					isok=false;break;
        				}
        			}
        			if(a==end[i]) {
        				if(temp.size()==m) {
        					isok=false;break;
        				}else {
        					stack_begin.removeFirst();
        					queue.add(in);
        					queue.add(out);
        				}
        			}else {
        				isok=false;
        				break;
        			}
    				
    			}
    			
    		}
    	}
    	if(isok) {
    		for(int i=0;i<queue.size();i++) {
    			System.out.println(queue.get(i));
    		}
    	}
    	else {
    		System.out.println(output);
    	}
    	
    	
    }  
    
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB是一种在工程和科学领域广泛使用的编程语言和环境,可以用来解决各种复杂的计算问题,包括火车调度火车调度是指对火车列车的运行进行有效、安全和高效的安排和控制,以保证火车能够按时到达目的地,并最大限度地提高运输效率。MATLAB可以通过建立模型和编写算法来帮助进行火车调度。 首先,我们可以使用MATLAB对火车调度中的列车运行时间进行建模。通过收集列车发车和到的时间数据,以及考虑到与其他列车的交叉和超车情况,我们可以使用MATLAB编写算法来计算每个列车的到达和离开时间,以及列车之间的最小时间间隔,从而保证火车的安全和高效运行。 其次,MATLAB还可以用于优化火车调度方案。我们可以将火车调度问题视为一个优化问题,在给定的时间范围内,通过最小化列车的延误时间、最大化列车数量和最小化列车之间的冲突等目标来寻找最优的调度方案。使用MATLAB的优化工具箱,我们可以编写相应的目标函数和约束条件,然后通过求解器找到最优的调度结果。 此外,MATLAB还可以通过数据分析和可视化来帮助火车调度。我们可以使用MATLAB的统计工具和数据分析功能来分析列车运行数据,找出列车运行的规律和关键因素,从而改进调度方案。另外,MATLAB的可视化功能可以将列车的运行轨迹、到时间等信息绘制成图表或动态图像,方便调度员进行实时监控和决策。 综上所述,MATLAB是一个强大的工具,可以在火车调度中发挥重要作用。通过建立模型、编写算法、优化调度方案和进行数据分析与可视化,我们可以使用MATLAB实现火车调度的自动化和优化,提高列车运行的效率和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值