目录
题目
题目描述
给定五个数字组成的序列 a,1∼5 在这五个数字中均恰好出现一次。现在请按照如下操作对序列进行排序。
- 若 a1>a2,则交换 a1 和 a2。
- 若 a2>a3,则交换 a2 和 a3。
- 若 a3>a4,则交换 a3 和 a4。
- 若 a4>a5,则交换 a4 和 a5。
- 如果序列没有变成 {1,2,3,4,5},则回到第一步,继续排序。
请在每次交换后输出当前序列。
输入格式
输入只有一行五个数,表示序列 a。
输出格式
输出若干行,每行输出五个用空格隔开的整数,表示一次交换后的序列。
输入输出样例
输入 #1 输出 #1
2 1 5 3 4 1 2 5 3 4 1 2 3 5 4 1 2 3 4 5
输入 #2 输出 #2
2 3 4 5 1 2 3 4 1 5
2 3 1 4 5
2 1 3 4 5
1 2 3 4 5
说明/提示
数据规模与约定
对于全部的测试点,保证1≤a[i]≤5,a[i] 互不相同,且不是单调递增的。
提示
可以证明,交换次数不超过 25 次。
题目译自 COCI2008-2009 CONTEST #4 T1 MJEHURIC。
分析
注意看倒数第二行:交换次数不超过25次。
所以,我们可以使用暴力通过此题。
根据题目得知,最终序列一定是单调递增的,所以循环条件就是
while ((a[1] > a[2]) || (a[2] > a[3]) || (a[3] > a[4]) || (a[4] > a[5]))
然后,按照题意模拟,进行比较、交换、输出
代码
#include<bits/stdc++.h>
using namespace std;
//P6448 [COCI2008-2009#4] A
//题意:给出一个有5个数字的序列,每次比较相邻的两个数,并进行交换,输出每次交换后的结果
//1 ≤ a[i] ≤ 5
int a[6];
int main() {
for (int i = 1; i <= 5; i++) {
cin >> a[i];
}
//如果还不是有序序列,继续循环
while ((a[1] > a[2]) || (a[2] > a[3]) || (a[3] > a[4]) || (a[4] > a[5])) {
//比较
if (a[1] > a[2]) {
//交换
swap(a[1], a[2]);
//输出
for (int j = 1; j <= 5; j++) {
cout << a[j] << ' ';
}
cout << endl;
}
if (a[2] > a[3]) {
swap(a[2], a[3]);
for (int j = 1; j <= 5; j++) {
cout << a[j] << ' ';
}
cout << endl;
}
if (a[3] > a[4]) {
swap(a[3], a[4]);
for (int j = 1; j <= 5; j++) {
cout << a[j] << ' ';
}
cout << endl;
}
if (a[4] > a[5]) {
swap(a[4], a[5]);
for (int j = 1; j <= 5; j++) {
cout << a[j] << ' ';
}
cout << endl;
}
}
return 0;
}