美文网首页PAT
甲级|1042.Shuffling Machine

甲级|1042.Shuffling Machine

作者: yzbkaka | 来源:发表于2018-10-27 11:20 被阅读1次

    题目描述

    Shuffling is a procedure used to randomize a deck of playing cards. Because standard shuffling techniques are seen as weak, and in order to avoid "inside jobs" where employees collaborate with gamblers by performing inadequate shuffles, many casinos employ automatic shuffling machines. Your task is to simulate a shuffling machine.

    The machine shuffles a deck of 54 cards according to a given random order and repeats for a given number of times. It is assumed that the initial status of a card deck is in the following order:
    S1, S2, ..., S13,
    H1, H2, ..., H13,
    C1, C2, ..., C13,
    D1, D2, ..., D13,
    J1, J2.
    where "S" stands for "Spade", "H" for "Heart", "C" for "Club", "D" for "Diamond", and "J" for "Joker". A given order is a permutation of distinct integers in [1, 54]. If the number at the i-th position is j, it means to move the card from position i to position j. For example, suppose we only have 5 cards: S3, H5, C1, D13 and J2. Given a shuffling order {4, 2, 5, 3, 1}, the result will be: J2, H5, D13, S3, C1. If we are to repeat the shuffling again, the result will be: C1, H5, S3, J2, D13.

    输入描述

    Each input file contains one test case. For each case, the first line contains a positive integer K (≤20) which is the number of repeat times. Then the next line contains the given order. All the numbers in a line are separated by a space.

    输出描述

    For each test case, print the shuffling results in one line. All the cards are separated by a space, and there must be no extra space at the end of the line.

    输入例子

    2
    36 52 37 38 3 39 40 53 54 41 11 12 13 42 43 44 2 4 23 24 25 26 27 6 7 8 48 49 50 51 9 10 14 15 16 5 17 18 19 1 20 21 22 28 29 30 31 32 33 34 35 45 46 47

    输出例子

    S7 C11 C10 C12 S1 H7 H8 H9 D8 D9 S11 S12 S13 D10 D11 D12 S3 S4 S6 S10 H1 H2 C13 D2 D3 D4 H6 H3 D13 J1 J2 C1 C2 C3 C4 D1 S5 H5 H11 H12 C6 C7 C8 C9 S2 S8 S9 H10 D5 D6 D7 H4 H13 C5

    我的代码

    #include<stdio.h>
    int main(){
        char a[5]={'S','H','C','D','J'};  //a为字符串来存储字母
        int i,j,n,b[55],c[55],d[55];  
        //b是存储开始时牌的位置,c是来存储输入牌的位置,d是来存储变换之后的牌的位置
    
        scanf("%d",&n);  //输入要转换的次数
        for(i=1;i<=54;i++){  //b一开始是位置=牌号
            b[i]=i;
        }
        for(i=1;i<=54;i++){  //输入要转换的位置
            scanf("%d",&c[i]);
        }
        for(i=0;i<n;i++){
            for(j=1;j<=54;j++){
                d[c[j]]=b[j];
            }
            for(j=1;j<=54;j++){
                b[j]=d[j];
            }
        }
        
        for(i=1;i<=54;i++){
            if(i!=54){
                printf("%c%d ",a[(b[i]-1)/13],(b[i]-1)%13+1);  //按照格式来输出,注意空格
            }
            else{
                printf("%c%d",a[(b[i]-1)/13],(b[i]-1)%13+1);
            }
        }
        return 0;
    } 
    

    我的分析

    这道题其实在中间对牌进行转换的部分的算法很好想到,主要是在输出方面比较难以操作。我一开始是打算用一个字符串将S1、S2......J2这些所有的牌号都存储在一起,但是操作之后发现并不可行。所以之后就想到了这个方法:先将牌的5个花色存储在一个字符串中char a[5]={'S','H','C','D','J'};,设牌的编号为x,算出(x-1)/13,则x在[1,13]的范围内a[(x-1)/13]对应的都是S。在[14,26]的范围内a[(x-1)/13]对应的都是H,以此类推,就可以知道牌的花色。然后是牌的编号,因为牌的最大编号不能超过13,所以需要用x%13+1来计算每一张牌的序号。

    相关文章

      网友评论

        本文标题:甲级|1042.Shuffling Machine

        本文链接:https://www.haomeiwen.com/subject/sczrtqtx.html