B3688 [语言月赛202212] 旋转排列 题解
B3688 [语言月赛202212] 旋转排列 题解
Source & Knowledge
2022 年 12 月语言月赛,由洛谷网校入门计划/基础计划提供。
本题考察循环结构。
文字题解
题目大意
给出一个排列
现在,给定一个长度为
- 对当前的排列
p 做一次“shift”操作; - 输出本次“shift”以后的排列
p ; - 判断排列
p 的最后一个数字是否是n ,如果是,则结束循环操作;否则回到1 继续操作。
一次“shift”操作是指:将
解析
shift 操作
考虑一次 shift 操作如何完成:可以令
核心代码为:
int temp = p[n];
for (int i = n; i >= 2; --i) p[i] = p[i - 1];
p[1] = temp;
输出操作
需要输出一行
for (int i = 1; i <= n; ++i) {
cout << p[i] << " \n"[i == n];
}
在上文的代码中," \n" 是一个长度为 [] 运算符来访问其某一位。
当 i == n 的值为 " \n"[0],则输出一个空格;
当 i == n 的值为 " \n"[1],则输出换行符。
循环操作
注意到循环操作的要求:先执行循环体,再进行判断。这提示我们使用 do - while 语句。
do - while 语句的结构是 do A while (B),代码会先执行语句(块) A(无论 B 是否为真),再执行判断语句 B,如果 B 为假,则终止执行,否则反复执行语句(块)A 直到 B 为假。
结合上面的分析,我们可以写出循环部分的核心代码:
do {
int temp = p[n];
for (int i = n; i >= 2; --i) p[i] = p[i - 1];
p[1] = temp;
for (int i = 1; i <= n; ++i) {
cout << p[i] << " \n"[i == n];
}
} while (p[n] != n);
视频题解
完整代码请在视频中查看。