交换瓶子(蓝桥杯)
有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é)
- 上一篇: 固定伤害职业堆属性好,还是堆技能好
- 下一篇: 贪心算法---背包问题(物品可以分割问题