UVA10205 - Stack 'em Up(模擬)

UVA10205 - Stack 'em Up(模擬)

題目鏈接

題目大意:給你52張牌,這些牌一開始就有個順序。現在給你每次的洗牌動作,52個數Ai,表示第i個位置上的牌放到Ai位置。意思就是能夠通過這次洗牌,可以將i位置上的牌放到Ai位置上。至於後面的牌要不要移動什麼的,根本不考慮。反正就是通過這次的洗牌,我給你52個數,把每個位置上的牌更新了一下。

解題思路:之前的題意看錯,還以爲是每次洗牌然後插入,後面才發現題意是這樣的。那麼只需要記錄下上次洗牌的每個位置的牌,然後在將這次洗牌動作後的每個位置的牌更新,模擬洗牌,最後輸出每個位置的牌。

代碼:

#include <cstdio>
#include <vector>

using namespace std;

const char Suit[4][10] = {"Clubs", "Diamonds", "Hearts", "Spades"};
const char Value[13][10] = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};
const int maxn = 105;

int op[maxn][52];
int d[52];

struct card {
    int suit;
    int value;
    card(int suit = 0, int value = 0) {
        this->suit = suit;
        this->value = value;
    }
};

vector<card> v;

void init () {

    for (int i = 0; i < 52; i++)
        d[i] = i;    
}

void Operator (int K) {

    int c[52];
    for (int i = 0; i < 52; i++)
        c[i] = d[op[K][i] - 1];

    for (int i = 0; i < 52; i++)
        d[i] = c[i];
}

void output() {

    for (int i = 0; i < 52; i++)
        printf ("%s of %s\n", Value[v[d[i]].value], Suit[v[d[i]].suit]);
}

int main () {

    int T, N, K;
    char str[maxn];
    scanf ("%d", &T);

    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 13; j++)
            v.push_back(card(i, j));

    while (T--) {    
        scanf ("%d", &N);
        init();

        for (int i = 0; i < N; i++)
            for (int j = 0; j < 52; j++)
                scanf ("%d", &op[i][j]);

        getchar();
        while (gets(str) != NULL && str[0] != '\0') {
                sscanf (str, "%d", &K);
                Operator(K - 1);
        }

        output();
        if (T)
            printf ("\n");
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章