1 条题解

  • 0
    @ 2025-5-12 8:45:12

    题意分析

    本题要求根据歌曲中诗节的行数判断其押韵类型。歌曲由一个或多个诗节组成,每个诗节包含四行。程序需要判断每个诗节是完全押韵(a a a aa\ a\ a\ a)、偶数押韵(a a b ba\ a\ b\ b)、交叉押韵(a b a ba\ b\ a\ b)、外壳押韵(a b b aa\ b\ b\ a)还是自由押韵(无上述规则)。

    解题思路

    1. 数据输入与预处理
      • 读取诗节数量NN
      • 读取每个诗节的四行内容,并将每行转换为小写字母形式。
      • 提取每行的最后一个音节,存储在jg数组中。
    2. 判断押韵类型
      • 检查jg数组中的元素,根据不同的押韵模式判断诗节的押韵类型。
      • 输出每个诗节的押韵类型。

    代码解释

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        int NUM;
        cin >> NUM;
        string a[NUM][4];
        string jg[NUM][4];
        string c;
        getline(cin, c); // 读取第一行后的换行符
    
        // 读取每个诗节的四行内容,并转换为小写字母形式
        for (int i = 0; i < NUM; i++)
        {
            for (int j = 0; j < 4; j++)
            {
                getline(cin, a[i][j]);
                int hi = 0;
                for (int k = a[i][j].size() - 1; k >= 0; k--)
                {
                    if ((a[i][j][k] >= 'A') && (a[i][j][k] <= 'Z')) // 转换为小写字母
                    {
                        a[i][j][k] = a[i][j][k] + 32;
                    }
                    if ((a[i][j][k] == 'a')
                        || (a[i][j][k] == 'i')
                        || (a[i][j][k] == 'e')
                        || (a[i][j][k] == 'o')
                        || (a[i][j][k] == 'u')) // 元音字母
                    {
                        jg[i][j] = a[i][j].substr(k);
                        hi = 1;
                        break;
                    }
                    else if ((a[i][j][k] ==' ')) // 遇到空格
                    {
                        jg[i][j] = a[i][j].substr(k + 1);
                        hi = 1;
                        break;
                    }
                }
                if (hi == 0) // 没有元音字母
                {
                    jg[i][j] = a[i][j];
                }
            }
        }
    
        // 判断并输出每个诗节的押韵类型
        for (int i = 0; i < NUM; i++)
        {
            if ((jg[i][0] == jg[i][1]) && (jg[i][0] == jg[i][2]) && (jg[i][0] == jg[i][3]))
            {
                cout << "perfect" << endl;
            }
            else if ((jg[i][0] == jg[i][1]) && (jg[i][2] == jg[i][3]))
            {
                cout << "even" << endl;
            }
            else if ((jg[i][0] == jg[i][2]) && (jg[i][1] == jg[i][3]))
            {
                cout << "cross" << endl;
            }
            else if ((jg[i][0] == jg[i][3]) && (jg[i][1] == jg[i][2]))
            {
                cout << "shell" << endl;
            }
            else
            {
                cout << "free" << endl;
            }
        }
    
        return 0;
    }
    

    注意事项

    1. 输入处理
      • 使用getline(cin, c)读取第一行后的换行符,避免影响后续输入。
      • 使用getline(cin, a[i][j])读取每行内容,确保能处理包含空格的行。
    2. 字母转换
      • 将大写字母转换为小写字母,以便统一处理。
    3. 最后音节提取
      • 从每行末尾开始向前搜索元音字母,提取从该元音字母到行尾的子串作为最后音节。
      • 如果没有找到元音字母,则将整行作为最后音节。
    4. 押韵类型判断
      • 按照完全押韵、偶数押韵、交叉押韵、外壳押韵的顺序依次判断,最后输出结果。

    复杂度分析

    • 时间复杂度O(N×L)O(N \times L),其中NN是诗节数量,LL是每行的最大长度。
    • 空间复杂度O(N×L)O(N \times L),用于存储诗节内容和最后音节。

    该算法通过简单的字符串处理和条件判断,实现了对歌曲诗节押韵类型的判断,代码简洁明了,易于理解和实现。

    • 1

    信息

    ID
    1658
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者