您当前的位置: 首页 > 

PolarDay.

暂无认证

  • 5浏览

    0关注

    144博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CSP 202112-3 登机牌条码 (详细图解)

PolarDay. 发布时间:2022-03-11 21:28:40 ,浏览量:5

CSP 202112-3 登机牌条码 更新:2023-5-15

感谢这位同学提出的代码错误,经过改正后,已经可以满分通过了,博客中出现的相应代码也都改正过了,可以直接提交

题目链接

大模拟 做这类题首先一定要读懂题目,这种题往往不会有什么很高深的算法,就是对整个过程的一个模拟,一定要完全理解了题目的整个内容之后再开始写代码

题目整体可以分为两部分,第一部分是求数据码字,第二部分是求校验码,其中数据码字比较好求,看懂题目跟着题目走就可以了,求出数据码字就可以水40分了,后面的难点在于求校验码,这里我的代码只拿到了60分,但没有找到出错的地方,下面给大家详细写一下我的思路,希望能帮助到大家,如果大家找出了我代码中的错误,还请不吝赐教。

数据码字的求解

求数据码字就是给你一个字符串然后对其进行一个编码,其中各个字符所对应的值题目中都已经给出了,唯一需要注意的点就是三种模式的切换。

首先可以先写一个transmode函数用来进行三种模式的切换

void transmode(vector &vec, int &oldm, int newm)
{
    if (oldm == 1)
    {
        if (newm == 2)
            vec.push_back(27);
        if (newm == 3)
            vec.push_back(28);
    }
    if (oldm == 2)
    {
        if (newm == 1)
        {
            vec.push_back(28);
            vec.push_back(28);
        }
        if (newm == 3)
            vec.push_back(28);
    }
    if (oldm == 3)
    {
        if (newm == 1)
            vec.push_back(28);
        if (newm == 2)
            vec.push_back(27);
    }
    oldm = newm;
}

有了模式切换之后就可以对字符串进行一个初步的编码,定义一个mode变量用来保存当前的模式,遍历字符串,首先切换到当前字符的模式,然后加入字符的编码即可,最后注意是否需要填充字符,全部字符转换完成后,按照题目要求两两一组计算码字即可

vector bianma(string s)
{
    vector ret;
    int mode = 1; //当前模式:1:大写;2:小写;3:数字
    for (char c : s)
    {
        if (isupper(c)) //大写字母
        {
            //将模式换为大写
            if (mode != 1)
                transmode(ret, mode, 1);
            ret.push_back(c - 'A');
        }
        if (islower(c)) //小写字母
        {
            //将模式换为小写
            if (mode != 2)
                transmode(ret, mode, 2);
            ret.push_back(c - 'a');
        }
        if (isdigit(c)) //数字
        {
            if (mode != 3)
                transmode(ret, mode, 3);
            ret.push_back(c - '0');
        }
    }
    if (ret.size() % 2 != 0)
        ret.push_back(29);
    vector mazi;
    for (int i = 0; i             
关注
打赏
1659342973
查看更多评论
0.0379s