浙大 | PTA 自测-5 Shuffling Machine (20分)

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

直接排序就可以,但是奇怪的是处理字符串复制的时候我用的是strcpy函数,但是一直报错(core dump),后面改成直接assign的形式 就是newone[newindex[j]-1] = pokerStr[j];反而可以运行,关键是指针怎么能直接等于另一个指针呢?如果您知道其中的原理,或是能指出我理解错误的地方,请求您给我留言,谢谢!

自问自答: 因为在程序的一开始就在静态存储区初始化了字符串,剩下的操作不需要用到任何字符串复制,只需要进行指针之间的复制就可以了,当然为了方便理解也可以用strcpy,那么初始化字符数组的时候要用 char polerstr[54] [4], , 下面空的字符数组newone[54][4], 然后27 29 行都用strcpy代替assign就可以了。
基础知识非常重要,之后还是把 c primer plus的东西整理一下,再开一个分类好了。

我的学校大一时以Python来入门的,但是相较于Python,用C来写代码的时候更有一种快意的感觉呢。。。各位也有同样的感觉吗?

#include 
#include 
#include 
//27 29拷贝字符串地址,程序中没用到字符串的复制,全部用指针的替换来解决问题,所有字符串在程序的第八行初始化于静态存储区中(static memory)
int main(void)
{
    int n;
    char * pokerStr[54]={"S1","S2","S3","S4","S5","S6","S7","S8","S9","S10","S11","S12","S13",
						 "H1","H2","H3","H4","H5","H6","H7","H8","H9","H10","H11","H12","H13",
                         "C1","C2","C3","C4","C5","C6","C7","C8", "C9","C10","C11","C12","C13",
                         "D1","D2","D3","D4","D5","D6","D7","D8","D9","D10","D11","D12","D13",
                         "J1","J2"};
                         
                         
    char * newone[54] = {};
    int newindex[54] = {0};
    scanf("%d", &n);
    while (getchar() != '\n') continue;

    for (int i = 0; i < 54; i++)
        scanf("%d", &newindex[i]);
       
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 54; j ++)
            newone[newindex[j]-1] = pokerStr[j];
        for (int k = 0; k < 54; k++)
            pokerStr[k] = newone[k];
    }
    for (int i = 0; i < 54; i++)
    {
        if (i != 0) printf(" %s",pokerStr[i]);
        else printf("%s", pokerStr[i]);
    }
    printf("\n");
    
    return 0;
}

你可能感兴趣的:(数据结构-起步能力自测,c语言,oj系统)