Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.18 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using uint = unsigned int;
  4. using ll = long long;
  5. using pii = pair<int, int>;
  6. #define dbg(x) cerr<<#x": "<<(x)<<'\n'
  7. #define dbg_p(x) cerr<<#x": "<<(x).first<<' '<<(x).second<<'\n'
  8. #define dbg_v(x, n) {cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n';}
  9. #define all(v) v.begin(), v.end()
  10. #define fi first
  11. #define se second
  12. #define INF 2000000010
  13. #define MOD 1000000007
  14. #define ST_SIZE 1048600
  15. #define QMAX
  16. #define NMAX 20
  17.  
  18. char s[NMAX][NMAX];
  19. int a[NMAX][NMAX];
  20. int col[NMAX], row[NMAX], ptr[NMAX][NMAX];
  21.  
  22. bool ok(int x, int y, int val) {
  23.     if(col[y] & (1 << val)) return 0;
  24.     if(col[x] & (1 << val)) return 0;
  25.     if(ptr[x / 4 * 4][y / 4 * 4] & (1 << val)) return 0;
  26.     return 1;
  27.     for(int j = 0; j < 16; ++j) if(a[x][j] == val) return false;
  28.     for(int i = 0; i < 16; ++i) if(a[i][y] == val) return false;
  29.    
  30.     int l = x / 4 * 4;
  31.     int c = y / 4 * 4;
  32.    
  33.     for(int i = l; i < l + 4; ++i)
  34.         for(int j = c; j < c + 4; ++j)
  35.             if(a[i][j] == val) return false;
  36.    
  37.     return true;
  38. }
  39.  
  40. bool full() {
  41.     for(int i = 0; i < 16; ++i)
  42.         for(int j = 0; j < 16; ++j)
  43.             if(a[i][j] == -1) return false;
  44.    
  45.     return true;
  46. }
  47.  
  48. bool bkt2(int toComplete) {
  49.     if(toComplete == 0) {
  50.         for(int i = 0; i < 16; ++i, cout << '\n')
  51.             for(int j = 0; j < 16; ++j) cout << char('A' + a[i][j]);
  52.         return true;
  53.     }
  54.    
  55.     int x, y, nrsol = 100;
  56.    
  57.     for(int i = 0; i < 16; ++i)
  58.         for(int j = 0; j < 16; ++j) {
  59.             if(a[i][j] != -1) continue;
  60.            
  61.             int nr = 0;
  62.             for(int val = 0; val < 16; ++val) if(ok(i, j, val)) ++nr;
  63.            
  64.             if(nr < nrsol) nrsol = nr, x = i, y = j;
  65.         }
  66.    
  67.     for(int val = 0; val < 16; ++val)
  68.         if(ok(x, y, val)) {
  69.             a[x][y] = val; col[y] ^= (1 << val); row[x] ^= (1 << val); ptr[x / 4 * 4][y / 4 * 4] ^= (1 << val);
  70.             if(bkt2(toComplete - 1)) return true;
  71.             a[x][y] = -1;  col[y] ^= (1 << val); row[x] ^= (1 << val); ptr[x / 4 * 4][y / 4 * 4] ^= (1 << val);
  72.         }
  73.    
  74.     return false;
  75. }
  76.  
  77. bool bkt(int used) {
  78.   cerr << used << '\n';
  79.     if(!used) {
  80.         for(int i = 0; i < 16; ++i, cout << '\n')
  81.             for(int j = 0; j < 16; ++j) cout << char('A' + a[i][j]);
  82.         return true;
  83.     }
  84.    
  85.     int mn = 100;
  86.     for(int i = 0; i < 16; ++i)
  87.         for(int j = 0; j < 16; ++j)
  88.             if(a[i][j] == -1) {
  89.                 int cnt = 0;
  90.                 for(int val = 0; val < 16; ++val) {
  91.                     if(!ok(i, j, val)) continue;
  92.                     ++cnt;
  93.                 }
  94.                 mn = min(mn, cnt);
  95.             }
  96.  
  97.     for(int i = 0; i < 16; ++i)
  98.         for(int j = 0; j < 16; ++j)
  99.             if(a[i][j] == -1) {
  100.                 int cnt = 0;
  101.                 for(int val = 0; val < 16; ++val) {
  102.                     if(!ok(i, j, val)) continue;
  103.                     ++cnt;
  104.                 }
  105.                 if(cnt != mn || cnt > 2) continue;
  106.  
  107.                 for(int val = 0; val < 16; ++val) {
  108.                     if(!ok(i, j, val)) continue;
  109.                     a[i][j] = val; col[j] ^= (1 << val); row[i] ^= (1 << val); ptr[i / 4 * 4][j / 4 * 4] ^= (1 << val);
  110.                     if(bkt(used - 1)) return 1;
  111.                     a[i][j] = -1; col[j] ^= (1 << val); row[i] ^= (1 << val); ptr[i / 4 * 4][j / 4 * 4] ^= (1 << val);
  112.                 }
  113.             }
  114.    
  115.     return false;
  116. }
  117.  
  118. int main()
  119. {
  120.     ios_base::sync_with_stdio(false);
  121.    
  122.     int i, j, toComplete;
  123.    
  124.     while(cin >> s[0]) {
  125.         for(i = 0; i < 16; ++i) col[i] = 0, row[i] = 0;
  126.         for(i = 0; i < 4; ++i)
  127.           for(j = 0; j < 4; ++j)
  128.             ptr[i][j] = 0;
  129.         for(i = 1; i < 16; ++i) cin >> s[i];
  130.        
  131.         for(toComplete = 0, i = 0; i < 16; ++i)
  132.             for(j = 0; j < 16; ++j)
  133.                 if(s[i][j] == '-') a[i][j] = -1, ++toComplete;
  134.                 else a[i][j] = (s[i][j] - 'A'), col[j] |= (1 << a[i][j]), row[i] |= (1 << a[i][j]), ptr[i / 4 * 4][j / 4 * 4] |= (1 << a[i][j]);
  135.        
  136.       cout << bkt(toComplete) << '\n';
  137.     }
  138.    
  139.     return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement