Advertisement
nguyenhung1903

Problem C: Magic Checkerboard

Sep 1st, 2021
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.85 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long long oo = (1e18) + 7;
  6.  
  7. int main()
  8. {
  9.     freopen("test.inp","r",stdin);
  10.     int n, m;
  11.     cin>>n>>m;
  12.     int a[n][m];
  13.     for (int i = 0;i<n;++i)
  14.     for (int j = 0;j<m;++j) cin>>a[i][j];
  15.  
  16.     ////////////////////
  17.  
  18.     long long res = oo;
  19.     int t[2][2];
  20.     int mat[n][m];
  21.  
  22.     for (int i = 0;i<2;++i){
  23.         t[0][0] = i;
  24.         t[1][1] = 1-i;
  25.         for (int j = 0;j<2;++j){
  26.             t[1][0] = j;
  27.             t[0][1] = 1-j;
  28.             for (int r = 0;r<n;++r)
  29.                 for (int c = 0;c<m;++c)
  30.                 {
  31.                     mat[r][c] = a[r][c];
  32.                 }
  33.  
  34.                 // Solve
  35.                 long long cnt = 0;
  36.                 bool isConnected = (n > 1 && m > 1);
  37.                 bool isRunning = true;
  38.                 for (int r = 0;r<n;++r){
  39.                     for (int c = 0;c<m;++c){
  40.                         int prevCol = 0, prevRow = 0;
  41.                         if (r>0) prevRow = mat[r-1][c];
  42.                         if (c>0) prevCol = mat[r][c-1];
  43.                         int NextValue = max(prevCol, prevRow) + 1;
  44.                         if (isConnected && NextValue %2 != t[r%2][c%2]) NextValue++;
  45.  
  46.                         if (mat[r][c] == 0)
  47.                             mat[r][c] = NextValue;
  48.                         else if ((mat[r][c] < NextValue) || (isConnected && mat[r][c] % 2 != NextValue % 2))
  49.                             {
  50.                                 isRunning = false;
  51.                                 break;
  52.                             }
  53.                         cnt += mat[r][c];
  54.                     }
  55.                     if (isRunning == false) {cnt = oo; break;}
  56.                 }
  57.                 // endl
  58.                 res = min(res, cnt);
  59.         }
  60.     }
  61.     if (res == oo) cout << -1; else
  62.     cout << res;
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement