PAT---A1042 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

解题思路
1.先获取输入的序号放入一个数组中(order),然后将对应的编号放入一个新的数组中(mid_order),放的位置由数组order的值进行确定。然后进行K-1次循环,就是将数组mid_order的值放入final_order中,放的位置依旧由order数组的值决定。然后将final_order的值全部复制到mid_order中进行循环以再次排序。最终输出
2.另法:(思路)也可以将1~54循环赋值到mid_order数组中,然后进行while(K–)循环K次。

参考代码

#include <iostream>
using namespace std;
int main()
{
    int K;
    cin >> K;                               //循环的次数
    int order[54];                          //输入的序号
    int mid_order[54];                      //过程变量,用来存储经过第一次调序后的编号(不是序号,编号指S1,S2,S3...这些)
    int final_order[54];                    // 用来存放最后
                                //一次调整顺序后的编号,当然,也指调整
    for(int i=0;i<54;i++)
        cin >> order[i];                    //将序号输入
    char cr[5] = {'S','H','C','D','J'};    
    for(int i = 0; i< 54 ; i++)
        mid_order[order[i]-1] = i + 1 ;  // 将1~54的编号输入到mid_order数组中   如 order[4]为3(来源于题意)则代表S5需要放到第三个位置上,由代码,得当i=4时,mid_order[2] = 5 ,即符合题意。
//order[i]代表需要放置的位置,而数组是从0开始,则mid_order[order[i]-1]中的-1来源于此。等式右边的i+1中的i因为从0开始,题意所给编号从1开始,所以需要加1。
    while(--K)  //因为前面已经改变一次顺序了,所以用--K代表运行K-1次
    {

        for(int i = 0; i< 54 ; i++)
            final_order[order[i]-1]= mid_order[i];  //与上方雷同
        for(int i = 0; i< 54 ; i++)
           mid_order[i] = final_order[i] ;   //为使之循环,
                                       //用mid_order数组存储临时变量
    }
    for(int i = 0; i< 54 ;i++)
        {
            cout << cr[(mid_order[i]-1)/13];
                 //因为要使1~13对应0,14~26对应1,这里采用(X-1)/13 
                 //的方法可以达到效果
            cout << (mid_order[i]-1)%13+1;
                  //因为要是1~13对应的是1~13,14~26对应的也是1~13,所
                  //以采用(X-1)%13+1的方式可以达到这个效果
            if(i!=53)
                 cout <<" ";  //最后一个输出值后不打空格,即最后
                              //一个i=53,即if(i!=53)时不打空格
        }

 return 0;
}




另法:

#include <iostream>
using namespace std;
int main()
{
    int K;
    cin >> K;              
    int order[54];         
    int mid_order[54];
    int final_order[54];
    for(int i=0;i<54;i++)
        cin >> order[i];      
    char cr[5] = {'S','H','C','D','J'};
    for(int i = 0; i< 54 ; i++)
           mid_order[i] = i + 1 ;         //此处修改
    while(K--)                            //此处修改
    {

        for(int i = 0; i< 54 ; i++)
            final_order[order[i]-1]= mid_order[i];
        for(int i = 0; i< 54 ; i++)
           mid_order[i] = final_order[i] ;
    }
    for(int i = 0; i< 54 ;i++)
        {
            cout << cr[(mid_order[i]-1)/13];

            cout << (mid_order[i]-1)%13+1;

            if(i!=53)
                cout <<" ";
        }

 return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值