Source code for submission s782

rhino.cpp

  1. #include <algorithm>
  2. #include <cctype>
  3. #include <cmath>
  4. #include <complex>
  5. #include <cstdio>
  6. #include <cstring>
  7. #include <iomanip>
  8. #include <iostream>
  9. #include <list>
  10. #include <map>
  11. #include <queue>
  12. #include <set>
  13. #include <sstream>
  14. #include <stack>
  15. #include <string>
  16. #include <utility>
  17. #include <vector>
  18. using namespace std;
  19.  
  20. #define DEBUG(x) cout << ">>> " << #x << " : " << x << endl;
  21. #define REP(i,a) for (int i = 0; i < (a); ++i)
  22. #define FOR(i,a,b) for (int i = (a); i <= (b); ++i)
  23. #define FORD(i,a,b) for (int i = (a); i >= (b); --i)
  24. inline bool EQ(double a, double b) { return fabs(a-b) < 1e-9; }
  25.  
  26. const int INF = 1<<29;
  27. typedef long long ll;
  28. ///////////////////////////////////////////////////////////////////////////
  29.  
  30. const int MAX = 14;
  31.  
  32. int get_rank(char c)
  33. {
  34. switch(c)
  35. {
  36. case '2': return 1; break;
  37. case '3': return 2; break;
  38. case '4': return 3; break;
  39. case '5': return 4; break;
  40. case '6': return 5; break;
  41. case '7': return 6; break;
  42. case '8': return 7; break;
  43. case '9': return 8; break;
  44. case 'X': return 9; break;
  45. case 'J': return 10; break;
  46. case 'Q': return 11; break;
  47. case 'K': return 12; break;
  48. case 'A': return 13; break;
  49. }
  50. DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
  51. return -1;
  52. }
  53.  
  54. int get_suit(char c)
  55. {
  56. switch(c)
  57. {
  58. case 'c': return 0; break;
  59. case 'd': return 1; break;
  60. case 'h': return 2; break;
  61. case 's': return 3; break;
  62. }
  63. DEBUG("AAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
  64. return -1;
  65. }
  66.  
  67. struct Card
  68. {
  69. int rank, suit;
  70. };
  71.  
  72. struct Hand
  73. {
  74. int type;
  75. int order;
  76. Hand(): type(-1), order(0) {}
  77.  
  78. bool operator<(const Hand & h) const
  79. {
  80. return type < h.type || (type == h.type && order < h.order);
  81. }
  82.  
  83. bool operator==(const Hand & h) const
  84. {
  85. return type == h.type && order == h.order;
  86. }
  87. };
  88.  
  89. int get_order(int start, vector<int> & v)
  90. {
  91. REP(i, v.size())
  92. start = start*MAX + v[v.size()-1-i];
  93. }
  94.  
  95. int ranks[MAX], suits[4];
  96. Hand get_hand(vector<Card> & cards)
  97. {
  98. memset(ranks, 0, sizeof(ranks));
  99. memset(suits, 0, sizeof(suits));
  100. REP(i, cards.size())
  101. {
  102. ++ranks[cards[i].rank];
  103. ++suits[cards[i].suit];
  104. }
  105.  
  106. int straight = 0, flush = 0;
  107. vector<int> one, two, three, four;
  108. REP(i, MAX)
  109. if (ranks[i] == 1) one.push_back(i);
  110. else if (ranks[i] == 2) two.push_back(i);
  111. else if (ranks[i] == 3) three.push_back(i);
  112. else if (ranks[i] == 4) four.push_back(i);
  113. REP(i, 4)
  114. if (suits[i] == 5) ++flush;
  115.  
  116. ranks[0] = ranks[MAX-1];
  117. REP(i, MAX)
  118. {
  119. if (i+5 > MAX) break;
  120. bool ok = true;
  121. REP(j, 5)
  122. if (!ranks[i+j]) ok = false;
  123. if (ok) straight = i+1;
  124. }
  125.  
  126. Hand result;
  127. // royal flush
  128. if (straight && flush)
  129. {
  130. result.type = 8;
  131. result.order = straight;
  132. }
  133. // poker
  134. else if (four.size())
  135. {
  136. result.type = 7;
  137. result.order = four[0] * MAX + one[0];
  138. }
  139. // full house
  140. else if (three.size() && two.size())
  141. {
  142. result.type = 6;
  143. result.order = three[0] * MAX + two[0];
  144. }
  145. // flush
  146. else if (flush)
  147. {
  148. result.type = 5;
  149. result.order = get_order(0, one);
  150. }
  151. // straight
  152. else if (straight)
  153. {
  154. result.type = 4;
  155. result.order = straight;
  156. }
  157. // three
  158. else if (three.size())
  159. {
  160. result.type = 3;
  161. result.order = three[0];
  162. result.order = get_order(result.order, one);
  163. }
  164. // two pairs
  165. else if (two.size() == 2)
  166. {
  167. result.type = 2;
  168. result.order = get_order(0, two);
  169. result.order = get_order(result.order, one);
  170. }
  171. // pair
  172. else if (two.size())
  173. {
  174. result.type = 1;
  175. result.order = two[0];
  176. result.order = get_order(result.order, one);
  177. }
  178. // one card
  179. else
  180. {
  181. result.type = 0;
  182. result.order = get_order(0, one);
  183. }
  184.  
  185. return result;
  186. }
  187.  
  188. Card table[7], player[10][2];
  189.  
  190. int main()
  191. {
  192. int N;
  193. while (scanf("%d", &N) == 1)
  194. {
  195. char r, s;
  196. REP(i, 5)
  197. {
  198. scanf(" %c %c", &r, &s);
  199. table[i].rank = get_rank(r);
  200. table[i].suit = get_suit(s);
  201. }
  202. REP(i, N) REP(j, 2)
  203. {
  204. scanf(" %c %c", &r, &s);
  205. player[i][j].rank = get_rank(r);
  206. player[i][j].suit = get_suit(s);
  207. }
  208.  
  209. Hand best;
  210. vector<int> winners;
  211. REP(p, N)
  212. {
  213. table[5] = player[p][0];
  214. table[6] = player[p][1];
  215. Hand hand;
  216. FOR(f1, 0, 6) FOR(f2, f1+1, 6)
  217. {
  218. vector<Card> h;
  219. REP(i, 7)
  220. if (i != f1 && i != f2)
  221. h.push_back(table[i]);
  222. Hand temp = get_hand(h);
  223. if (hand < temp) hand = temp;
  224. }
  225.  
  226. if (best < hand)
  227. {
  228. best = hand;
  229. winners.clear();
  230. }
  231. if (best == hand)
  232. {
  233. winners.push_back(p);
  234. }
  235. }
  236.  
  237. REP(i, winners.size())
  238. {
  239. if (i) printf(" ");
  240. printf("%d", winners[i]+1);
  241. }
  242. printf("\n");
  243. }
  244. return 0;
  245. }
  246.