// Stack ’em Up (完美洗牌術)// PC/UVa IDs: 110205/10205, Popularity: B, Success rate: average Level: 1// Verdict: Accepted// Submission Date: 2011-05-23// UVa Run Time: 0.036s//// 著作權(C)2011,邱秋。metaphysis # yeah dot net//// 直接根據題意類比洗牌的過程即可。#include <iostream>#include <vector>#include <cstdlib>#include <cstring>using namespace std;#define TOTAL 52// 一副牌的的數量。#define SUITS 13// 一副牌牌面值的種數。// 按洗牌方法交換牌的位置。void swap(int card[], vector < int > shuffle){int tmp[TOTAL];for (int i = 0; i < TOTAL; i++)tmp[i] = card[shuffle[i] - 1];memcpy(card, tmp, TOTAL * sizeof(int));}// 顯示牌的面值及花色。void display(int card[]){string value[] = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" };string suit[] = { "Clubs", "Diamonds", "Hearts", "Spades" };for (int i = 0; i < TOTAL; i++) { cout << value[(card[i] - 1) % SUITS] << " of "; cout << suit[(card[i] - 1) / SUITS] << endl; }}int main(int argc, char *argv[]){string line;int cases, means, cards[TOTAL];vector < vector < int > > shuffles;vector < vector < int > >::iterator start;cin >> cases;while (cases--){// 讀入洗牌術的具體操作。cin >> means;shuffles.clear();shuffles.resize(means);for (start = shuffles.begin(); start < shuffles.end(); start++)(*start).resize(TOTAL);start = shuffles.begin();for (int j = 0; j < means; j++){for (int k = 0; k < TOTAL; k++)cin >> (*start)[k];start++;}// 使用 1 - 52 的整數來表示每一張牌,牌面值按 2 - A,花色按黑桃,方塊,紅心,// 梅花的順序。for (int m = 0; m < TOTAL; m++)cards[m] = (m + 1);cin.ignore();// 讀入所用的洗牌術序號。並按洗牌術交換牌的順序。while (getline(cin, line), line.length())swap(cards, shuffles[atoi(line.data()) - 1]);// 顯示交換後牌的面值及花色。display(cards);if (cases)cout << endl;}return 0;}