1 条题解
-
0
题意分析
本题要求根据歌曲中诗节的行数判断其押韵类型。歌曲由一个或多个诗节组成,每个诗节包含四行。程序需要判断每个诗节是完全押韵()、偶数押韵()、交叉押韵()、外壳押韵()还是自由押韵(无上述规则)。
解题思路
- 数据输入与预处理:
- 读取诗节数量。
- 读取每个诗节的四行内容,并将每行转换为小写字母形式。
- 提取每行的最后一个音节,存储在
jg
数组中。
- 判断押韵类型:
- 检查
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; }
注意事项
- 输入处理:
- 使用
getline(cin, c)
读取第一行后的换行符,避免影响后续输入。 - 使用
getline(cin, a[i][j])
读取每行内容,确保能处理包含空格的行。
- 使用
- 字母转换:
- 将大写字母转换为小写字母,以便统一处理。
- 最后音节提取:
- 从每行末尾开始向前搜索元音字母,提取从该元音字母到行尾的子串作为最后音节。
- 如果没有找到元音字母,则将整行作为最后音节。
- 押韵类型判断:
- 按照完全押韵、偶数押韵、交叉押韵、外壳押韵的顺序依次判断,最后输出结果。
复杂度分析
- 时间复杂度:,其中是诗节数量,是每行的最大长度。
- 空间复杂度:,用于存储诗节内容和最后音节。
该算法通过简单的字符串处理和条件判断,实现了对歌曲诗节押韵类型的判断,代码简洁明了,易于理解和实现。
- 数据输入与预处理:
- 1
信息
- ID
- 1658
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者