夜雨聆风学习资料网

ARTICLE · 1304387

2026 CSP-J第二轮真题题1详细解析

2026 CSP-J第二轮真题题1详细解析

题解:

分析输入信息

输入四个字符串:c1 s1 c2 s2

其中座位串 s(例如03C):

前 2 个字符为排号字符串

最后 1 个字符为座位字母 ch(A/B/C/D/F)

为了便于分清楚是否座位相邻,我们可以建立座位字母映射表

左侧{A,B,C}: A→0,B→1,C→2

右侧{D,F}: D→0,F→1

同时写一个函数,输入字母,返回它在哪一侧(左 / 右),以及它的序号。

根据题目意思,我们可以设置四个变量,ans1,ans2,ans3,ans4,分别表示是否属于同一个车厢,是否属于同一排,是否属于同一侧,是否属于相邻座位。

依次计算4 个 值,用bool 标记

ans1:c1 == c2

ans2:ans1 并且 s1前两位 == s2前两位

ans3:ans2 并且 两个字母属于同一侧(都左 或者 都右)

ans4:ans3 并且 两个字母在同侧的序号差的绝对值 == 1

注意:ans2 依赖 ans1,ans3 依赖 ans2,ans4 依赖 ans3;前面是 0,后面自然也是 0。

输出

把 ans1 ans2 ans3 ans4 按顺序拼成字符串输出(1 代表 true,0 代表 false)

AC代码:

#include<iostream>#include<string>#include<cmath>using namespace std;// 获取座位属于哪一侧:0=左边A/B/C,1=右边D/Fintget_side(char ch){    if (ch == 'A' || ch == 'B' || ch == 'C')        return 0;    else // D F        return 1;}// 获取在这一侧里面的序号intget_id(char ch){    if (ch == 'A') return 0;    if (ch == 'B') return 1;    if (ch == 'C') return 2;    if (ch == 'D') return 0;    if (ch == 'F') return 1;    return -1; // 题目保证输入合法,不会执行到这里}intmain(){    string c1, s1, c2, s2;    cin >> c1 >> s1 >> c2 >> s2;    bool a1 = (c1 == c2);    bool a2 = false;    string p1 = s1.substr(0, 2);    string p2 = s2.substr(0, 2);    if (a1)    {        a2 = (p1 == p2);    }    bool a3 = false;    char ch1 = s1.back();    char ch2 = s2.back();    int side1, side2;    side1 = get_side(ch1);    side2 = get_side(ch2);    if (a2)    {        a3 = (side1 == side2);    }    bool a4 = false;    int id1, id2;    id1 = get_id(ch1);    id2 = get_id(ch2);    if (a3)    {        if (abs(id1 - id2) == 1)        {            a4 = true;        }    }    cout << (a1 ? "1" : "0")         << (a2 ? "1" : "0")         << (a3 ? "1" : "0")         << (a4 ? "1" : "0")         << endl;    return 0;}

附字符串考点知识

字符串string重要考点

头文件必须写:#include <string>,同时using namespace std;(考场常用)

或者万能头文件:#include<bits/stdc++.h>

定义:string s;或者string s = "abc";

一、基础读写

string s;cin >> s; // 读一个字符串,遇到空格/回车停止getline(cin, s); // 读一整行,可以读空格(注意前面有cin要吃掉换行)cout << s; // 输出整个字符串

二、获取长度

s.size(); // 返回字符个数,无符号整数(最常用)s.length(); // 和 size() 完全一样,等价示例:string s="abc"; s.size() → 3

三、下标访问(从0 开始!重点)

s[0]; // 第一个字符s[1]; // 第二个字符s[s.size()-1]; // 最后一个字符

四、首尾字符(你刚才问的back () 在这)

s.front(); // 返回第一个字符,等价 s[0]s.back(); // 返回最后一个字符,等价 s[s.size()-1] 注意:空字符串不能调用front /back,会报错。

五、追加字符/ 字符串

s += 'a'; // 在末尾加一个字符(单引号!char)s += "xyz"; // 在末尾加一串(双引号,字符串)s.push_back('5'); // 末尾添加单个字符,和 s+='5' 效果一样

六、删除

s.pop_back(); // 删除最后一个字符,无返回值!(非常常用)s.erase(pos, len); // 从pos位置开始,删掉len个字符// 例:s.erase(1,2); 从下标1开始删2个字符s.clear(); // 清空整个字符串,变成空串 ""

七、截取子串substr

s.substr(start, cnt);// start:起始下标,cnt:取多少个字符;cnt省略就一直取到末尾string t = s.substr(2,3);例子:s="abcdef",s.substr(1,3) → "bcd"

八、查找find

s.find("ab"); // 找子串,返回起始下标;找不到返回 string::nposs.find('x'); // 找单个字符if(s.find("hi") != string::npos) {// 找到了}string::npos 是一个很大的常量,代表查找失败。

九、比较(直接用运算符!超方便)

string a="abc", b="abd";if (a < b) {} // 字典序比较(和查字典一样)if (a == b) {}if (a != b) {}if (a > b) {}CSP-J 里直接 == 判断字符串相等,不用手写循环!

十、插入insert

s.insert(pos, "xxx"); // 在pos下标前面插入字符串// s = "acd"; s.insert(1,"b"); → "abcd"

十一、判断是否为空

s.empty(); // 是空串返回 true,否则 falseif(s.empty()) { ... }

十二、遍历字符串(两种写法)

// 写法1:下标遍历for(int i=0;i<s.size();i++){char ch = s[i];}// 写法2:范围for(C++11及以上,考场编译器支持)for(char ch : s){// ch依次取每个字符}

十三、字符和字符串转换(CSP-J 高频)

1.数字字符→ 数字:ch - '0'char c = '5';int x = c - '0'; // x=52.数字→ 字符:x + '0'int x = 7;char c = x + '0'; // c='7'3.int 转 string:to_string()int a = 123;string t = to_string(a); // t = "123"

十四、交换

swap(a,b); // 交换两个string a和b

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料