列车厢调度

在这里插入图片描述

大家或许在某些数据结构教材上见到过“列车厢调度问题”(当然没见过也不要紧)。今天,我们就来实际操作一下列车厢的调度。对照上方的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 <stack>
#include <cstring>
using namespace std;
int way[100];
char a[100],b[100];
int main(){
    cin>>a;
    cin>>b;
    stack<char> stk;
    int len=strlen(a);
    int now=0,temp=0;//分别是第二个字符串位置和路径的位次
    bool flag=true;//是否可以完成调度
    for (int i = 0; i < len; ++i) {
        if(a[i]!=b[now]){
            if(stk.empty()||stk.top()!=b[now]){
                stk.push(a[i]);
                way[temp++]=1;
            } else if(stk.top()==b[now]){
                stk.pop();
                way[temp++]=3;
                now++;
                i--;//注意没有用到i,i要减,下一次判断
            }else if((!stk.empty())&&stk.top()!=b[now]){
                flag=false;
                break;
            }

        }else{
            way[temp++]=2;
            now++;
        }
    }
    while (!stk.empty()&&flag){//把栈中的输出
        if(stk.top()==b[now]){
            stk.pop();
            now++;
            way[temp++]=3;
        } else{
            flag=false;
        }
    }
    if(flag){
        for (int i = 0; i < temp; ++i) {
            if(way[i]==1)cout<<"1->3"<<endl;
            if(way[i]==2)cout<<"1->2"<<endl;
            if(way[i]==3)cout<<"3->2"<<endl;
        }
    } else{
        cout<<"Are you kidding me?"<<endl;
    }
}
### 数据结构课程设计中车厢调度的实现方案与算法设计 在数据结构课程设计中,车厢调度问题是一个典型的综合实践项目。该项目结合了排序、搜索、优先队和图算法等核心概念,旨在提升学生对数据结构的理解以及编程能力[^1]。 #### 1. 数据结构的选择与应用 车厢调度问题需要模拟复杂的铁路系统操作,因此选择合适的数据结构至关重要。例如: - **链表**:用于表示车厢,便于插入和删除操作。 - **栈**:适用于模拟车厢进出站的操作,尤其是当车厢调度涉及后进先出(LIFO)逻辑时。 - **队**:适合处理先进先出(FIFO)的调度场景,如车厢按顺序进入或离开车站。 - **优先队**:可用于优化调度策略,例如根据车厢优先级安排进出站次序。 - **图结构**:可以建模铁路网络中的路径规划问题,使用最短路径算法(如Dijkstra或A*)优化调度路线。 ```python # 示例代码:使用栈模拟车厢进出站 class TrainStation: def __init__(self): self.stack = [] def enter_station(self, car_id): self.stack.append(car_id) def leave_station(self): if not self.stack: return None return self.stack.pop() # 测试代码 station = TrainStation() station.enter_station(1) station.enter_station(2) print(station.leave_station()) # 输出: 2 ``` #### 2. 算法设计与递归实现 车厢调度问题可以通过递归方法解决,关键在于理解问题的递归关系并设计合适的递归框架[^2]。例如,假设我们需要将一组车厢按照特定顺序重新排,则可以通过以下步骤实现: - 定义递归基例:当车厢已满足目标顺序时,停止递归。 - 在每一步中,尝试将当前车厢移动到正确位置,并递归处理剩余部分。 ```java // 示例代码:Java实现车厢调度的递归算法 public class CarriageScheduler { public static void schedule(int[] cars, int targetIndex) { if (targetIndex < 0 || targetIndex >= cars.length) { return; } // 将目标车厢移动到正确位置 int temp = cars[targetIndex]; for (int i = targetIndex; i > 0; i--) { cars[i] = cars[i - 1]; } cars[0] = temp; // 递归处理下一个目标车厢 schedule(cars, targetIndex + 1); } public static void main(String[] args) { int[] cars = {4, 3, 2, 1}; schedule(cars, 0); System.out.println(Arrays.toString(cars)); // 输出: [1, 2, 3, 4] } } ``` #### 3. 并发与多线程编程 在实际铁路系统中,车厢调度可能涉及多个并发操作。因此,项目还需要考虑多线程编程技术,确保调度过程的安全性和效率。例如,可以使用Java的`Thread`类或`ExecutorService`来管理多个调度任务。 ```java // 示例代码:使用Java线程模拟多车厢调度 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThreadedScheduler { public static void main(String[] args) { ExecutorService executor = Executors.newFixedThreadPool(4); for (int i = 1; i <= 4; i++) { final int carriageId = i; executor.submit(() -> { System.out.println("Carriage " + carriageId + " is being scheduled."); }); } executor.shutdown(); } } ``` #### 4. 系统测试与性能评估 完成调度算法的设计后,需要进行全面的测试以验证其正确性和性能。这包括单元测试、集成测试以及压力测试,确保系统能够在高负载情况下稳定运行。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值