铁轨(Rails, ACM/ICPC CERC 1997, UVa 514)rust解法

有一个火车站,铁轨铺设如图6-1所示。有n节车厢从A方向驶入车站,按进站顺序编号为1~n。你的任务是判断是否能让它们按照某种特定的顺序进入B方向的铁轨并驶出车站。例如,出栈顺序(5 4 1 2 3)是不可能的,但(5 4 3 2 1)是可能的。

为了重组车厢,你可以借助中转站C。这是一个可以停放任意多节车厢的车站,但由于末端封顶,驶入C的车厢必须按照相反的顺序驶出C。对于每个车厢,一旦从A移入C,就不能再回到A了;一旦从C移入B,就不能回到C了。换句话说,在任意时刻,只有两种选择:A→C和C→B。

【分析】

在中转站C中,车厢符合后进先出的原则,因此是一个栈。

样例:

输入

复制代码
5
5 4 3 2 1

输出

复制代码
yes

解法:

rust 复制代码
use std::{collections::VecDeque, io};

fn main() {
    let mut buf = String::new();
    io::stdin().read_line(&mut buf).unwrap();
    let n: usize = buf.trim().parse().unwrap();
    let mut source = VecDeque::from((1..=n).collect::<Vec<_>>());
    let mut buf = String::new();
    io::stdin().read_line(&mut buf).unwrap();
    let target: Vec<usize> = buf.split_whitespace().map(|x| x.parse().unwrap()).collect();
    let mut b = 0;
    let mut s: VecDeque<usize> = VecDeque::new();
    while b < n {
        if !source.is_empty() && *source.front().unwrap() == target[b] {
            source.pop_front();
            b += 1;
        } else if !s.is_empty() && *s.back().unwrap() == target[b] {
            s.pop_back();
            b += 1;
        } else if !source.is_empty() {
            s.push_back(source.pop_front().unwrap());
        } else {
            break;
        }
    }
    if b == n {
        println!("yes");
    } else {
        println!("no");
    }
}
相关推荐
Flynt4 小时前
pnpm 12 换上了 Rust 内核,我拿项目实测了一轮构建速度
rust·vite·前端工程化
传奇开心果编程8 小时前
【Xilem基础语法学与练】第8课:条件渲染(one_of)
学习·rust·前端框架
qwsaedca10 小时前
在Mac上跑 Kokoro TTS经验总结
rust·mac·tts
qwsaedca10 小时前
Kokoro TTS v1.1 voices 文件格式逆向分析
rust
老猿讲编程13 小时前
【Eclipse OpenSOVD学习之五】拓扑引擎(Topology)
学习·rust·eclipse·sovd
object not found13 小时前
Nuxt4去掉body中默认的边距
开发语言·后端·rust
梦醒沉醉1 天前
4、Rust参考手册——Crate和源文件
rust
chainbees1 天前
Windows 系统 Rust 运行环境搭建
rust
k4m7v2pz1 天前
从 Python 搬到 Rust:pyglet MIDI DAW 变成 egui 鬼畜采样器的迁移复盘
开发语言·python·rust