题目描述 小明有n(0<n<=1000)张卡片,每张卡片上都标明了1~1000之间的某个数字,这n张卡片本来是有序的,可是小明的舍友不小心把卡片打乱了,小明现在想通过一些操作把这些卡片变回有序的,且小明是个思想简单的人,他操作的方式只有一种:交换任意两张卡片的位置。现在,小明想知道他最少交换几次才能达到目的。 输入 多组测试数据,直到输入文件结束。每组测试数据包含两行,第一行为整数n,表示待排序的卡片数量(0<n<=100),第二行为n个1~1000之间的整数,表示被打乱的卡片上的数字。 输出 输出最少需交换几次可以整理好卡片,每组测试数据输出结果占一行。 样例输入 4 1 2 3 4 4 4 3 2 1 样例输出 0 2 提示用c语言写出该代码
时间: 2024-03-05 09:49:31 浏览: 245
```c
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) != EOF) {
int arr[n], sorted[n]; // arr存储输入的卡片数字,sorted存储卡片数字的有序序列
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
sorted[i] = arr[i]; // 初始化有序序列
}
// 冒泡排序得到卡片数字的有序序列
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (sorted[j] > sorted[j + 1]) {
int temp = sorted[j];
sorted[j] = sorted[j + 1];
sorted[j + 1] = temp;
}
}
}
int count = 0; // 记录交换次数
for (int i = 0; i < n; i++) {
if (arr[i] != sorted[i]) { // 如果当前位置上的数字不是有序序列对应位置的数字,则需要交换
int j = i + 1;
while (arr[j] != sorted[i]) { // 找到需要交换的数字在卡片数字中的位置
j++;
}
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
count++;
}
}
printf("%d\n", count);
}
return 0;
}
```
阅读全文