有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:
2 1 3 5 4
要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:
1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。
输入格式为两行:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。
输出数据为一行一个正整数,表示至少交换多少次,才能完成排序。
例如,输入:
5
3 1 2 5 4
程序应该输出:
3
再例如,输入:
5
5 4 3 2 1
程序应该输出:
2
思路分析:
拿案例来说: 输入 5 表示5个瓶子,分别标号1~5;
输入 3 1 2 5 4(表示不同标号的瓶子排放位置的先后次序)
3 1 2 5 4 首先第一个位置的瓶子标号为3 ,然后,找位置为3的瓶子,进行交换
2 1 3 5 4(此时,第一个位置的瓶子标号为2,然后,找位置为2的瓶子,进行交换)
1 2 3 5 4(由于第一个位置的瓶子标号跟位置一致,进行下一个位置查找,直到发现第4个位置的瓶子标号为5,进行交换)
1 2 3 4 5(结束)
代码如下:
#include <iostream>
#include<stdio.h>
using namespace std;int main(){int a[10001];//用来存放各个瓶子的标号int i,j,sum=0;//sum代表 计数,最后一共交换多少次int x,t;//x代表 一共有几个瓶子 t为一个交换的中间变量scanf("%d",&x);//输入一个几个瓶子for(i=1;i<=x;i++){scanf("%d",&a[i]);//按从1~x的位置以次输入不同标号的瓶子}for(j=1;j<=x;j++){//按位置进行查找交换while(a[j] != j){//如果位置与瓶子的标号不一致,进交换位置t=a[a[j]];//找到第j个位置上的瓶子标号(1<=j<=x),然后找到该标号对应的位置上的那个瓶子标号a[a[j]]=a[j];//将第j个位置上的瓶子(1<=j<=x),与该瓶子标号相同的位置上的那个瓶子进行交换a[j]=t;//将第j个位置上的瓶子,找到与给瓶子的标号相同的位置上的瓶子,进行交换sum++;//交换一下,计数加一}}printf("%d",sum);return 0;
}