PTA 翁恺 7-43 Shuffling Machine

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.

Input Specification:

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.

Output Specification:

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.

Sample Input:

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
 
结尾无空行

Sample Output:

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
 
结尾无空行
 
整体思路:
times存储循环次数,i,j用于循环,temp用于数值交换,数组R存储了输入的随机数列,数组AB用于存储后续变换的值,本来想只用一个数组内部赋值,但是破坏了原有的数组结构,就不得不用两个数组相互赋值了。AB数组中的初始值都是0-53.循环一次times - 1,其为偶数时A数组往B数组赋值,其为奇数时,B数组往A数组赋值,最后结果在A数组中存储。
到了输出环节,就要用到循环中内嵌循环了。例如输出样例,A[6]=1,6代表的是第(6+1)张牌,为牌序,也就是S7,1代表的是顺序排在第一。外循环的i代表顺序,内循环的j代表牌序。内循环中不断循环从小找到大即可。同时要注意到,题目中要求了结尾不能有空格,所以把最后一项单独拿出来输出,不加空格。
整体代码:
#include <stdio.h>

int main (void){
    int times = 0;  //重复次数
    scanf ("%d",&times);
    int i = 0,j = 0,temp = 0;
    int r[54] = {0}; //存储随机序列 
    int a[54] = {0}; //初始序列
    int b[54] = {0};
    
    for (i = 0;i < 54;++i)
    {
        scanf ("%d",&r[i]);
        a[i] = i + 1;
        b[i] = i + 1;
    }
    while (times > 0)
    {
        if (times %2 == 0)
        {
            for (i = 0;i < 54;++i)
            {
                temp = r[i];
                b[i] = a[temp - 1];
            }
        }
        if (times % 2 != 0)
        {
            for (i = 0;i < 54;++i)
            {
                temp = r[i];
                a[i] = b[temp - 1];
            }
        }
        times--;
    }
    for (i = 1;i < 54;++i)
    {
        for (j = 0;j < 54;++j)
        {
            if (a[j] == i)
            {
                if (j <= 12)
                    printf ("S%d ",j + 1);
                if (j > 12 && j <= 25)
                    printf ("H%d ",j - 12);
                if (j > 25 && j <= 38)
                    printf ("C%d ",j - 25);
                if (j > 38 && j <= 51)
                    printf("D%d ",j - 38);
                if (j > 51 && j <= 53)
                    printf ("J%d ",j - 51);
            }
        }
    }
    for (j = 0;j < 54;++j)
    {
        if (a[j] == 54)
        {
            if (j <= 12)
                 printf ("S%d",j + 1);
            if (j > 12 && j <= 25)
                 printf ("H%d",j - 12);
            if (j > 25 && j <= 38)
                 printf ("C%d",j - 25);
            if (j > 38 && j <= 51)
                 printf("D%d",j - 38);
            if (j > 51 && j <= 53)
                 printf ("J%d",j - 51);
        }
    }
    return 0;
}

 

posted @ 2021-10-20 22:00  海萌萌萌萌萌萌  阅读(58)  评论(0编辑  收藏  举报