【CSP真题】CSP-J 2026 旅游 luogu-P17827 | 适用于 GESP二级 / 三级 练习

四季读书网 10 0
【CSP真题】CSP-J 2026 旅游 luogu-P17827 | 适用于 GESP二级 / 三级 练习

💡 GESP 考级与信奥算法精选

【CSP真题】CSP-J 2026 旅游 luogu-P17827 | 适用于 GESP二级 / 三级 练习

✍️ 作者:OneCoder•🏷️ 分类:CSP/NOIP / CSP-J

CSP-J 2026 第二轮入门组第一题《旅游》(luogu-P17827),围绕高铁二等座车厢号、排号与过道两侧座位字母(A、B、C 与 D、F)的拆解判定展开,重点考查字符串下标访问、子串截取与多层条件分支逻辑,适合 GESP 二级与三级考生练习,难度 ⭐☆☆☆☆,洛谷难度等级 入门。

P17827 [CSP-J 2026] 旅游 / travel

🔗 洛谷原题传送门:luogu-P17827 [CSP-J 2026] 旅游 / travel

🔹 题目要求

题目描述

小 R 和小 X 准备坐高铁出门旅游。他们买了两张二等座车票,车票上写着各自的车厢号和座位号。两人希望座位相邻,这样旅途中可以坐在一起。

他们乘坐的列车由  节车厢组成,车厢编号是 01 到 17。其中,01 和 16 号车厢是一等座车厢,其余车厢是二等座车厢。两人买的都是二等座车票,座位都在二等座车厢中。每节二等座车厢共有  排,每排有  个座位。座位号由两位排号和一位大写字母组成,例如 03C 表示第  排 C 座。每一排的座位按照从左到右的顺序排列,座位字母依次是 A、B、C、D、F,其中 C 座与 D 座之间是过道,即每排过道左侧的座位序列是 A、B、C,右侧是 D、F。以下是一节二等座车厢的座位示意图:

【CSP真题】CSP-J 2026 旅游 luogu-P17827 | 适用于 GESP二级 / 三级 练习-第1张图片-四季读书网

两个座位相邻,当且仅当在同一节车厢的同一排,位于过道的同一侧,且在该侧的座位序列中相邻。

你需要帮助小 R 依次判断:

  • 两张车票对应的座位是否在同一节车厢;
  • 两张车票对应的座位是否在同一节车厢的同一排;
  • 两张车票对应的座位是否在同一节车厢的同一排,且位于过道的同一侧;
  • 两张车票对应的座位是否相邻。

输入格式

输入的第一行包含四个字符串 ,分别表示小 R 的车票上的车厢号、座位号,以及小 X 的车票上的车厢号、座位号。

输出格式

输出一行一个长度为  的 01 字符串,分别表示四个问题的答案,其中 1 代表是,0 代表否。

输入输出样例

输入 #1

02 01A 02 01B

输出 #1

1111

输入 #2

02 01C 02 01A

输出 #2

1110

输入 #3

02 01C 02 01D

输出 #3

1100

输入 #4

02 02B 02 01A

输出 #4

1000

输入 #5

02 01A 03 01A

输出 #5

0000

说明/提示

【样例 1 解释】

02 号车厢是二等座车厢。01A 和 01B 在同一节车厢、同一排、过道的同一侧,并且相邻,因此输出 1111。

【样例 2 解释】

两个座位在同一节车厢、同一排、过道的同一侧,但 01C 与 01A 中间隔着 01B,不相邻,因此输出 1110。

【数据范围】

对于所有测试数据,均有:

  •  是 01 到 17 之间除 01 和 16 外的两位车厢号;
  •  是对应车厢中的合法座位号,即前两位是 01 到 18 之间的排号,末位是 A、B、C、D、F 中的一个字母;
  • 两张车票对应的不是同一个座位,即  或 。
测试点编号
特殊性质
A, B, C
A, B
A
D
无
  • 特殊性质 A:两个座位在同一节车厢,即 。
  • 特殊性质 B:两个座位在同一排,即  的前两位与  的前两位相同。
  • 特殊性质 C:两个座位在过道的同一侧。
  • 特殊性质 D:小 R 的座位是 D 座,小 X 的座位是 F 座,即  的末位字符是 D, 的末位字符是 F。

🔹 题目分析

本题的四个问题呈层层递进(包含)关系:只有前一个条件成立,后一个条件才有可能成立。

1. 拆解座位号结构

每个座位号  固定为  个字符(例如 "03C"):

  • 前两位s.substr(0, 2)
    (或直接比较 s1[0] == s2[0] && s1[1] == s2[1])代表排号;
  • 第三位s[2]
     代表座位字母(取值为 'A'、'B'、'C'、'D'、'F',注意高铁没有 'E' 座)。

2. 四步递进判定逻辑

  1. 是否同一车厢(same_car)
    :直接比较字符串 c1 == c2。
  2. 是否同一车厢同一排(same_row)
    :在 same_car 为真的前提下,判断 s1.substr(0, 2) == s2.substr(0, 2)。
  3. 是否同排且位于过道同一侧(same_side)
    : 
    • 我们可以写一个辅助函数 is_left(char ch),当字符为 'A'、'B'、'C' 时返回 true(过道左侧),为 'D'、'F' 时返回 false(过道右侧)。
    • 在 same_row 为真的前提下,若 is_left(s1[2]) == is_left(s2[2]),则两人位于过道同一侧。
  4. 是否相邻(adjacent)
    :在 same_side 为真的前提下分两侧讨论: 
    • 若都在过道左侧(A、B、C)
      :只有 (A, B) 和 (B, C) 相邻,而 (A, C) 中间隔着 B 不相邻。利用字符 ASCII 码连续的性质,只需判断 abs(s1[2] - s2[2]) == 1;
    • 若都在过道右侧(D、F)
      :右侧一共只有 D 和 F 两个座位!注意 'F' - 'D' = 2(因为中间跳过了字母 E),所以只要两人在同一排右侧且座位不同(s1[2] != s2[2]),就必定是 D 座和 F 座相邻!这是本题最容易掉坑的细节,切勿直接对右侧也套用 abs(s1[2] - s2[2]) == 1。

🔹 示例代码

●●●cpp

#include <iostream>#include <string>#include <cmath>using namespace std;// P17827 [CSP-J 2026] 旅游 (travel)// 判断座位字母是否位于过道左侧(A、B、C 在过道左侧,D、F 在过道右侧)bool is_left(char ch) {    return ch == 'A' || ch == 'B' || ch == 'C';}int main() {    string c1, s1, c2, s2;    cin >> c1 >> s1 >> c2 >> s2;    // 1. 是否在同一节车厢    bool same_car = (c1 == c2);    // 2. 是否在同一节车厢的同一排(座位号前两位为排号)    bool same_row = same_car && (s1.substr(0, 2) == s2.substr(0, 2));    // 3. 是否在同一节车厢的同一排,且位于过道的同一侧    char seat1 = s1[2];    char seat2 = s2[2];    bool same_side = same_row && (is_left(seat1) == is_left(seat2));    // 4. 两个座位是否相邻    // 过道左侧序列为 A-B-C,字母ASCII码相差1即相邻;    // 过道右侧序列仅 D-F 两个座位,只要同侧且不同即相邻    bool adjacent = false;    if (same_side) {        if (is_left(seat1)) {            adjacent = (abs(seat1 - seat2) == 1);        } else {            adjacent = (seat1 != seat2);        }    }    cout << (same_car ? '1' : '0')         << (same_row ? '1' : '0')         << (same_side ? '1' : '0')         << (adjacent ? '1' : '0') << endl;    return 0;}

📚 往期关联真题与系统化备考:

本站已收录超 900+ 篇计算机与算法专题。由于微信公众号不支持外部链接直接跳转,建议点击左下角「阅读原文」直达个人网站,即可使用全局检索(Ctrl+K)、在线复制代码与浏览完整知识库!

【CSP真题】CSP-J 2026 旅游 luogu-P17827 | 适用于 GESP二级 / 三级 练习-第2张图片-四季读书网长按关注「OneCoder」公众号

抱歉,评论功能暂时关闭!