天天看點

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

繼續閱讀