PTA 1042

PTA 1042

オリジナルタイトル

シャッフルは、トランプのデッキをランダム化するために使用する手順です。標準シャッフリング技術が弱いと見られ、そして従業員が不十分なシャッフルを行うことで、ギャンブラーとのコラボレーション「内部ジョブ」を避けるために、多くのカジノが採用されているので自動シャッフルマシンをあなたの仕事は、シャッフル機をシミュレートすることです。

機械は、所定の回数のために与えられたランダムな順序と反復に応じて54枚のカードのデックをシャッフル。カードデッキの初期状態は、次の順序であると仮定されています。

S1, S2, ..., S13, 
H1, H2, ..., H13, 
C1, C2, ..., C13, 
D1, D2, ..., D13, 
J1, J2

      
    

ここで、「S」は「ジョーカー」のための「クラブ」のための「C」、「ダイヤモンド」のための「D」、および「J」、「ハート」のための「H」、「スペード」の略です。所定の順序は、[1、54]における異なる整数の順列です。数ならば、私番目の位置であり、jは、それが位置からカードを移動することを意味し、私が位置するJS3、H5、C1、D13とJ2:例えば、我々は唯一の5枚のカードを持っていると仮定します。シャッフリングの順序{4、2、5、3、1}が与えられると、結果は次のようになりますJ2、H5、D13、S3、C1。我々は再びシャッフルを繰り返すようにしている場合、結果は次のようになります。C1、H5、S3、J2、D13。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数含まK繰り返し回数である(≤20を)。そして、次の行は、与えられた順序が含まれています。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースのために、一列にシャッフル結果を印刷します。すべてのカードは、スペースで区切られ、行の最後に余分なスペースがあってはなりません。

サンプル入力:

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

新語

シャッフル混排

機械機械

手順手順、手続き、手順

Aのデッキ

カードカード

順列置換、交換

これらは読み取ることができない、実際には、それが通路に重要であり、重要ではありません。

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.

あなたが再出力を見て、約動揺することができ、54枚のカードである旨を受けます。

トピックコード

これは私がそれを自分で書いたものです

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//自己写的复杂的,罗里吧嗦的输出函数
void Change(int a[]) {
    int i;
    for (i = 0; i < 53; i++) {
        if (a[i] >= 0 && a[i] <= 12) {
            printf("S%d ", a[i] + 1);
        }
        else if (a[i] >= 13 && a[i] <= 25) {
            printf("H%d ", a[i] - 13 + 1);
        }
        else if (a[i] >= 26 && a[i] <= 38) {
            printf("C%d ", a[i] - 26 + 1);
        }
        else if (a[i] >= 39 && a[i] <= 51) {
            printf("D%d ", a[i] - 39 + 1);
        }
        else if (a[i] == 52 || a[i] == 53) {
            printf("J%d ", a[i] - 51);
        }
    }
    if (a[i] >= 0 && a[i] <= 12) {
        printf("S%d", a[i] + 1);
    }
    else if (a[i] >= 13 && a[i] <= 25) {
        printf("H%d", a[i] - 13 + 1);
    }
    else if (a[i] >= 26 && a[i] <= 38) {
        printf("C%d", a[i] - 26 + 1);
    }
    else if (a[i] >= 39 && a[i] <= 51) {
        printf("D%d", a[i] - 39 + 1);
    }
    else if (a[i] == 52 || a[i] == 53) {
        printf("J%d", a[i] - 51);
    }
}

int main(void) {
    int a[54], b[54];
    int P[54];
    for (int i = 0; i < 54; i++) {
        a[i] = i;
        b[i] = 0;
    }
    int K;
    scanf("%d", &K);
    for (int i = 0; i < 54; i++) {
        scanf("%d", &P[i]);
    }
    while (K--) {
        for (int i = 0; i < 54; i++) {
            b[P[i] - 1] = a[i];
        }
        for (int i = 0; i < 54; i++) {
            a[i] = b[i];
        }
    }
    
    Change(a);
    return 0;
}

以下のコードは改善されます

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int main(void) {
    int a[54], b[54];//这里我数组,起名,起的不好.
    int P[54];  //用来存放输入的数据的,Put
    char mp[5] = { 'S','H', 'C', 'D', 'J' };    //用来存放花色的
    for (int i = 0; i < 54; i++) {
        a[i] = i;
        b[i] = 0;
    }
    int K;
    scanf("%d", &K);
    for (int i = 0; i < 54; i++) {
        scanf("%d", &P[i]);
    }
    while (K--) {
        for (int i = 0; i < 54; i++) {
            b[P[i] - 1] = a[i];
        }
        //用新的数组覆盖A,循环使用
        for (int i = 0; i < 54; i++) {
            a[i] = b[i];
        }
    }
    //输出的部分
    for (int i = 0; i < 54; i++) {
        if (i != 0) printf(" ");    
        //通过关系,使用一个表达式就搞定了输出问题
        printf("%c%d", mp[a[i] / 13], a[i] % 13 + 1);
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/a-small-Trainee/p/12341284.html