日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

交换瓶子(蓝桥杯)

發(fā)布時(shí)間:2023/12/1 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 交换瓶子(蓝桥杯) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

有N個(gè)瓶子,編號(hào) 1 ~ N,放在架子上。

比如有5個(gè)瓶子:
2 1 3 5 4

要求每次拿起2個(gè)瓶子,交換它們的位置。
經(jīng)過若干次后,使得瓶子的序號(hào)為:
1 2 3 4 5

對(duì)于這么簡單的情況,顯然,至少需要交換2次就可以復(fù)位。

如果瓶子更多呢?你可以通過編程來解決。

輸入格式為兩行:
第一行: 一個(gè)正整數(shù)N(N<10000), 表示瓶子的數(shù)目
第二行:N個(gè)正整數(shù),用空格分開,表示瓶子目前的排列情況。

輸出數(shù)據(jù)為一行一個(gè)正整數(shù),表示至少交換多少次,才能完成排序。

例如,輸入:
5
3 1 2 5 4

程序應(yīng)該輸出:
3

再例如,輸入:
5
5 4 3 2 1

程序應(yīng)該輸出:
2

思路分析:

拿案例來說: 輸入 5 表示5個(gè)瓶子,分別標(biāo)號(hào)1~5;
輸入 3 1 2 5 4(表示不同標(biāo)號(hào)的瓶子排放位置的先后次序)

3 1 2 5 4 首先第一個(gè)位置的瓶子標(biāo)號(hào)為3 ,然后,找位置為3的瓶子,進(jìn)行交換
2 1 3 5 4(此時(shí),第一個(gè)位置的瓶子標(biāo)號(hào)為2,然后,找位置為2的瓶子,進(jìn)行交換)
1 2 3 5 4(由于第一個(gè)位置的瓶子標(biāo)號(hào)跟位置一致,進(jìn)行下一個(gè)位置查找,直到發(fā)現(xiàn)第4個(gè)位置的瓶子標(biāo)號(hào)為5,進(jìn)行交換)
1 2 3 4 5(結(jié)束)

代碼如下:

#include <iostream> #include<stdio.h> using namespace std;int main(){int a[10001];//用來存放各個(gè)瓶子的標(biāo)號(hào)int i,j,sum=0;//sum代表 計(jì)數(shù),最后一共交換多少次int x,t;//x代表 一共有幾個(gè)瓶子 t為一個(gè)交換的中間變量scanf("%d",&x);//輸入一個(gè)幾個(gè)瓶子for(i=1;i<=x;i++){scanf("%d",&a[i]);//按從1~x的位置以次輸入不同標(biāo)號(hào)的瓶子}for(j=1;j<=x;j++){//按位置進(jìn)行查找交換while(a[j] != j){//如果位置與瓶子的標(biāo)號(hào)不一致,進(jìn)交換位置t=a[a[j]];//找到第j個(gè)位置上的瓶子標(biāo)號(hào)(1<=j<=x),然后找到該標(biāo)號(hào)對(duì)應(yīng)的位置上的那個(gè)瓶子標(biāo)號(hào)a[a[j]]=a[j];//將第j個(gè)位置上的瓶子(1<=j<=x),與該瓶子標(biāo)號(hào)相同的位置上的那個(gè)瓶子進(jìn)行交換a[j]=t;//將第j個(gè)位置上的瓶子,找到與給瓶子的標(biāo)號(hào)相同的位置上的瓶子,進(jìn)行交換sum++;//交換一下,計(jì)數(shù)加一}}printf("%d",sum);return 0; }

總結(jié)

以上是生活随笔為你收集整理的交换瓶子(蓝桥杯)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。