1042シャッフルマシン(20点)sprintfの使用

https://pintia.cn/problem-sets/994805342720868352/problems/994805442671132672

シャッフルは、トランプのデッキをランダム化するために使用される手順です。標準的なシャッフル技術は弱いと見なされており、従業員が不適切なシャッフルを実行してギャンブラーと協力する「内部の仕事」を回避するために、多くのカジノは自動シャッフルマシンを採用してい ますあなたの仕事はシャッフルマシンをシミュレートすることです。

マシンは、与えられたランダムな順序に従って54枚のカードのデッキをシャッフルし、与えられた回数だけ繰り返します。カードデッキの初期状態は以下の順であると想定しています。

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

ここで、「S」は「スペード」、「H」は「ハート」、「C」は「クラブ」、「D」は「ダイアモンド」、「J」は「ジョーカー」を表します。与えられた順序は、[1、54]の異なる整数の順列です。i番目の位置の数字がjの場合、カードを位置iから位置jに移動することを意味します。たとえば、S3、H5、C1、D13、J2の5枚のカードしかないとします。シャッフル順序{4、2、5、3、1}が与えられると、結果は次のようになります:J2、H5、D13、S3、C1。シャッフルをもう一度繰り返すと、結果はC1、H5、S3、J2、D13になります。

入力仕様:

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

出力仕様:

テストケースごとに、シャッフル結果を1行で印刷します。すべてのカードはスペースで区切られ、行末に余分なスペースがあってはなりません。

サンプル入力:

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 <bits/stdc++.h>
using namespace std;
const int maxn = 1000;
char str[maxn][maxn];
char ou[maxn][maxn];
int num[maxn];
int main()
{
    int tp=1;
    for(int i=1; i<=13; i++)
    {
        sprintf(str[tp++], "S%d", i);
    }
    for(int i=1; i<=13; i++)
    {
        sprintf(str[tp++], "H%d", i);
    }
    for(int i=1; i<=13; i++)
    {
        sprintf(str[tp++], "C%d", i);
    }
    for(int i=1; i<=13; i++)
    {
        sprintf(str[tp++], "D%d", i);
    }
    for(int i=1; i<=2; i++)
    {
        sprintf(str[tp++], "J%d", i);
    }
    int k, x;
    cin>>k;
    for(int i=1; i<=54; i++)
    {
        cin>>num[i];
    }
    while(k--)
    {
        int tp=1;
        for(int i=1; i<=54; i++)
        {
            x = num[i];
            strcpy(ou[x], str[tp++]);
        }
        for(int i=1; i<=54; i++)
        {
            strcpy(str[i], ou[i]);
        }
    }
    for(int i=1; i<=54; i++)
    {
        printf("%s%c", ou[i], i==54?'\n':' ');
    }
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_42137874/article/details/104208637