| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- #include <algorithm>
- #include <array>
- #include <iostream>
- #include <map>
- #include <utility>
- #include <vector>
- #include <iomanip>
- #include <sstream>
- #include <climits>
- #include <queue>
- #include <list>
- #include <map>
- #include <string>
- using namespace std;
- typedef unsigned int nat;
- class Card;
- class Deck;
- ostream &operator <<(ostream &s, Card const &c);
- ostream &operator <<(ostream &s, Deck const &d);
- enum Suit
- {
- CLUBS,
- DIAMONDS,
- HEARTS,
- SPADES
- };
- map<Suit, string> suit_name = {{CLUBS, "Clubs"},
- {DIAMONDS, "Diamonds"},
- {HEARTS, "Hearts"},
- {SPADES, "Spades"}};
- map<nat, string> value_names = {{11, "Jack"},
- {12, "Queen"},
- {13, "King"},
- {14, "Ace"}};
- class Card
- {
- public:
- Card(nat value, Suit suit) : value{value}, suit{suit} {}
- private:
- nat value;
- Suit suit;
- friend ostream &operator <<(ostream &s, Card const &c);
- };
- class Deck
- {
- public:
- Deck()
- {
- for(auto s : suit_name)
- {
- for(nat v = 2; v < 15; ++v)
- {
- cards.push_back( Card{v, s.first} );
- }
- }
- }
- void add_shuffle_method(vector<nat> const &method) { shuffle_methods.push_back( vector<nat>(method)); }
- void shuffle(nat method)
- {
- vector<Card> new_order;
- for(nat i : shuffle_methods[method-1])
- {
- new_order.push_back(cards[i-1]);
- }
- cards.swap(new_order);
- }
- private:
- vector<Card> cards;
- vector<vector<nat>> shuffle_methods;
- friend ostream &operator <<(ostream &s, Deck const &d);
- };
- ostream &operator <<(ostream &s, Card const &c)
- {
- if(c.value < 11)
- {
- cout << c.value;
- }
- else
- {
- cout << value_names.find(c.value)->second;
- }
- cout << " of " << suit_name.find(c.suit)->second;
- return s;
- }
- ostream &operator <<(ostream &s, Deck const &d)
- {
- for(auto c : d.cards)
- {
- cout << c << endl;
- }
- return s;
- }
- int main()
- {
- nat num_tests;
- cin >> num_tests;
- for(nat test = 0; test < num_tests; ++test)
- {
- nat num_shuffle_methods;
- cin >> num_shuffle_methods;
- Deck d;
- for(nat met = 0; met < num_shuffle_methods; ++met)
- {
- vector<nat> method(52);
- for(nat m = 0; m < 52; ++m)
- {
- cin >> method[m];
- }
- d.add_shuffle_method(method);
- }
- string str;
- cin.ignore(1);
- getline(cin, str);
- while(!str.empty())
- {
- d.shuffle(stoul(str));
- getline(cin, str);
- }
- cout << d;
- if(test != (num_tests-1))
- {
- cout << endl;
- }
- }
- return 0;
- }
|