交换瓶子(蓝桥杯)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41264055/article/details/88069628

有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

扫描二维码关注公众号,回复: 5383998 查看本文章

思路分析:

拿案例来说: 输入 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;
}

猜你喜欢

转载自blog.csdn.net/qq_41264055/article/details/88069628