Advertisement
vlatkovski

UVa 10536 - Game of Euler

Dec 31st, 2018
363
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <ext/pb_ds/tree_policy.hpp>
  3. #include <ext/pb_ds/assoc_container.hpp>
  4. using namespace std;
  5. using namespace __gnu_pbds;
  6. typedef long long ll;
  7. typedef long double ld;
  8. typedef pair<int, int> pi;
  9. typedef pair<ll, ll> pl;
  10. typedef pair<ld, ld> pd;
  11. typedef vector<int> vi;
  12. typedef vector<ll> vl;
  13. typedef vector<ld> vd;
  14. typedef vector<pi> vpi;
  15. typedef vector<pl> vpl;
  16. template <class Key, class Compare = less<Key>> // find_by_order, order_of_key (for multiset: pair(val, time of insertion))
  17. using Tree = tree<Key, null_type, Compare, rb_tree_tag, tree_order_statistics_node_update>;
  18.  
  19.  
  20.  
  21.  
  22. int dp[4][1<<16];
  23.  
  24. int step(int p, int m) {
  25.   if (dp[p][m] != -1) {
  26.     return dp[p][m];
  27.   }
  28.   if (m == (1 << 16) - 1) {
  29.     return dp[p][m] = 1;
  30.   }
  31.   // perpendicular to board
  32.   for (int i = 0; i < 16; ++i) {
  33.     if ((m & (1 << i)) == 0) {
  34.       int m1 = m | (1 << i);
  35.       for (int d = 0; d < 3; ++d) {
  36.         if (d != p && step(d, m1) == 0) {
  37.           return dp[p][m] = 1;
  38.         }
  39.       }
  40.     }
  41.   }
  42.   // from left
  43.   for (int i = 0; i < 16; i += 4) {
  44.     int m1 = m;
  45.     for (int d = 0; d < 3; ++d) {
  46.       int j = i + d;
  47.       if ((m & (1 << j)) == 0) {
  48.         m1 |= (1 << j);
  49.         if (d != p && step(d, m1) == 0) {
  50.           return dp[p][m] = 1;
  51.         }
  52.       } else {
  53.         break;
  54.       }
  55.     }
  56.   }
  57.   // from right
  58.   for (int i = 3; i < 16; i += 4) {
  59.     int m1 = m;
  60.     for (int d = 0; d < 3; ++d) {
  61.       int j = i - d;
  62.       if ((m & (1 << j)) == 0) {
  63.         m1 |= (1 << j);
  64.         if (d != p && step(d, m1) == 0) {
  65.           return dp[p][m] = 1;
  66.         }
  67.       } else {
  68.         break;
  69.       }
  70.     }
  71.   }
  72.   // from top
  73.   for (int i = 0; i < 4; ++i) {
  74.     int m1 = m;
  75.     for (int d = 0; d < 3; ++d) {
  76.       int j = i + 4*d;
  77.       if ((m & (1 << j)) == 0) {
  78.         m1 |= (1 << j);
  79.         if (d != p && step(d, m1)) {
  80.           return dp[p][m] = 1;
  81.         }
  82.       } else {
  83.         break;
  84.       }
  85.     }
  86.   }
  87.   // from bottom
  88.   for (int i = 12; i < 16; ++i) {
  89.     int m1 = m;
  90.     for (int d = 0; d < 3; ++d) {
  91.       int j = i - 4*d;
  92.       if ((m & (1 << j)) == 0) {
  93.         m1 |= (1 << j);
  94.         if (d != p && step(d, m1)) {
  95.           return dp[p][m] = 1;
  96.         }
  97.       } else {
  98.         break;
  99.       }
  100.     }
  101.   }
  102.   return dp[p][m] = 0;
  103. }
  104.  
  105. void Solution() {
  106.   memset(dp, -1, sizeof(dp));
  107.   int T;
  108.   cin >> T;
  109.   while (T--) {
  110.     int m = 0;
  111.     for (int i = 0; i < 16; ++i) {
  112.       char ch;
  113.       cin >> ch;
  114.       if (ch == 'X') {
  115.         m |= (1 << i);
  116.       }
  117.     }
  118.     int res = 0;
  119.     for (int p = 0; p < 3; ++p) {
  120.       res = step(p, m);
  121.       if (res == 1) break;
  122.     }
  123.     cout << (res ? "WINNING\n" : "LOSING\n");
  124.   }
  125. }
  126.  
  127. int main() {
  128.   ios::sync_with_stdio(false);
  129.   cin.tie(nullptr);
  130.   #ifdef _DEBUG
  131.   freopen("in.txt", "r", stdin);
  132.   freopen("out.txt", "w", stdout);
  133.   #endif
  134.   Solution();
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement