2012藍橋杯【初賽試題】 巧排撲克牌
題目描述:
小明剛上小學,學會了第一個撲克牌“魔術”,到處給人表演。魔術的內容是這樣的:
他手裏握著一疊撲克牌:A,2,....J,Q,K 一共13張。他先自己精心設計它們的順序,然後正麵朝下拿著,開始表演。
隻見他先從最下麵拿一張放到最上麵,再從最下麵拿一張翻開放桌子上,是A;然後再從最下麵拿一張放到最上麵,再從最下麵拿一張翻開放桌子上,是2;......如此循環直到手中隻有一張牌,翻開放桌子上,剛好是K。
這時,桌上牌的順序是:A,2,3,4,5,6,7,8,9,10,J,Q,K
請你計算一下,小明最開始的時候手裏牌的順序是怎樣的。
把結果寫出來,逗號分割,小明“魔術”開始時,最下麵的那張牌輸出為第一個數據。
考場不提供撲克牌,你隻能用計算機模擬了,撕碎草稿紙模擬撲克屬於作弊行為!另外,你有沒有把錄像倒著放過?很有趣的!回去試試!
思路:題目中提示了“有沒有把錄像倒著放過?”這句話,意思就是讓魔術師的動作倒轉就可以求出原來牌的組合!仔細看,題目中“先從最下麵拿一張放到最上麵,再從最下麵拿一張翻開放桌子上”,倒過來就是“將放在桌子上的牌放在牌堆最下麵,將牌堆的最上麵一張放在最下麵”,好的,大功告成,隻要將結果按照這個順序排就OK了!
代碼1是按照魔術師的操作步驟編的程(用來測試的代碼):
如果按照魔術師的步驟,1,2,3,4,5經過變換之後最後結果是4,2,5,1,3
那麼請代碼2就是用反向思維將4,2,5,1,3變回1,2,3,4,5的
桌麵上是4,2,5,1,3
步驟:
3
31
13
135
351
3512
5123
51234
12345
附錄
代碼1:
#include<stdio.h> #include<stdlib.h> int a[23],b[23]; int main() { int i,j,n,m,x; for(i=0;i<13;i++) { scanf("%d",&a[i]); } n=0;m=13; while(n<13) { x=a[m-1]; for(i=m-1;i>=1;i--) a[i]=a[i-1]; a[0]=x; b[n++]=a[m-1]; m--; } for(i=0;i<n;i++) printf("%d ",b[i]); puts(""); system("pause"); return 0; }
代碼2:
#include<stdio.h> #include<stdlib.h> int a[23],b[23]; void Fun(int n) { int i,x; x=b[0]; for(i=0;i<n-1;i++) b[i]=b[i+1]; b[n-1]=x; } int main() { int i,j,n,m,x; for(i=0;i<13;i++) { scanf("%d",&a[i]); } n=0;m=13; while(n<13) { b[n++]=a[m-1]; m--; Fun(n); /*for(i=0;i<n;i++) printf("%d ",b[i]); puts("");*/ } for(i=0;i<n;i++) printf("%d ",b[i]); puts(""); system("pause"); return 0; }
最後答案是:10,6,K,5,9,4,J,3,8,2,Q,A,7
最後更新:2017-04-03 12:55:18