p10205.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include <algorithm>
  2. #include <array>
  3. #include <iostream>
  4. #include <map>
  5. #include <utility>
  6. #include <vector>
  7. #include <iomanip>
  8. #include <sstream>
  9. #include <climits>
  10. #include <queue>
  11. #include <list>
  12. #include <map>
  13. #include <string>
  14. using namespace std;
  15. typedef unsigned int nat;
  16. class Card;
  17. class Deck;
  18. ostream &operator <<(ostream &s, Card const &c);
  19. ostream &operator <<(ostream &s, Deck const &d);
  20. enum Suit
  21. {
  22. CLUBS,
  23. DIAMONDS,
  24. HEARTS,
  25. SPADES
  26. };
  27. map<Suit, string> suit_name = {{CLUBS, "Clubs"},
  28. {DIAMONDS, "Diamonds"},
  29. {HEARTS, "Hearts"},
  30. {SPADES, "Spades"}};
  31. map<nat, string> value_names = {{11, "Jack"},
  32. {12, "Queen"},
  33. {13, "King"},
  34. {14, "Ace"}};
  35. class Card
  36. {
  37. public:
  38. Card(nat value, Suit suit) : value{value}, suit{suit} {}
  39. private:
  40. nat value;
  41. Suit suit;
  42. friend ostream &operator <<(ostream &s, Card const &c);
  43. };
  44. class Deck
  45. {
  46. public:
  47. Deck()
  48. {
  49. for(auto s : suit_name)
  50. {
  51. for(nat v = 2; v < 15; ++v)
  52. {
  53. cards.push_back( Card{v, s.first} );
  54. }
  55. }
  56. }
  57. void add_shuffle_method(vector<nat> const &method) { shuffle_methods.push_back( vector<nat>(method)); }
  58. void shuffle(nat method)
  59. {
  60. vector<Card> new_order;
  61. for(nat i : shuffle_methods[method-1])
  62. {
  63. new_order.push_back(cards[i-1]);
  64. }
  65. cards.swap(new_order);
  66. }
  67. private:
  68. vector<Card> cards;
  69. vector<vector<nat>> shuffle_methods;
  70. friend ostream &operator <<(ostream &s, Deck const &d);
  71. };
  72. ostream &operator <<(ostream &s, Card const &c)
  73. {
  74. if(c.value < 11)
  75. {
  76. cout << c.value;
  77. }
  78. else
  79. {
  80. cout << value_names.find(c.value)->second;
  81. }
  82. cout << " of " << suit_name.find(c.suit)->second;
  83. return s;
  84. }
  85. ostream &operator <<(ostream &s, Deck const &d)
  86. {
  87. for(auto c : d.cards)
  88. {
  89. cout << c << endl;
  90. }
  91. return s;
  92. }
  93. int main()
  94. {
  95. nat num_tests;
  96. cin >> num_tests;
  97. for(nat test = 0; test < num_tests; ++test)
  98. {
  99. nat num_shuffle_methods;
  100. cin >> num_shuffle_methods;
  101. Deck d;
  102. for(nat met = 0; met < num_shuffle_methods; ++met)
  103. {
  104. vector<nat> method(52);
  105. for(nat m = 0; m < 52; ++m)
  106. {
  107. cin >> method[m];
  108. }
  109. d.add_shuffle_method(method);
  110. }
  111. string str;
  112. cin.ignore(1);
  113. getline(cin, str);
  114. while(!str.empty())
  115. {
  116. d.shuffle(stoul(str));
  117. getline(cin, str);
  118. }
  119. cout << d;
  120. if(test != (num_tests-1))
  121. {
  122. cout << endl;
  123. }
  124. }
  125. return 0;
  126. }