Advertisement
Dang_Quan_10_Tin

KNIGHTS (CSP TST)

Jun 13th, 2022
853
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #define taskname "KNIGHTS"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5. using namespace std;
  6. const int maxMN = 400;
  7. const int maxV = maxMN * maxMN;
  8. char a[maxMN][maxMN];
  9. int m, n, nvertices;
  10. int dx[8]{1, -1, 1, -1, 2, -2, 2, -2};
  11. int dy[8]{2, 2, -2, -2, 1, 1, -1, -1};
  12. vector<int> adj[maxV];
  13. vector<int> z;
  14. int match[maxV], avail[maxV];
  15. bool found;
  16.  
  17. inline bool Valid(int i, int j)
  18. {
  19.     return i >= 0 && i < m && j >= 0 && j < n && a[i][j] == '.';
  20. }
  21.  
  22. inline bool IsBlack(int i, int j)
  23. {
  24.     return a[i][j] == '.' && bool((i + j) & 1);
  25. }
  26.  
  27. inline bool IsWhite(int i, int j)
  28. {
  29.     return a[i][j] == '.' && !bool((i + j) & 1);
  30. }
  31.  
  32. inline int Encode(int i, int j)
  33. {
  34.     return i * n + j;
  35. }
  36.  
  37. void Enter()
  38. {
  39.     cin >> m >> n;
  40.     nvertices = m * n;
  41.     for (int i = 0; i < m; ++i)
  42.         for (int j = 0; j < n; ++j)
  43.             cin >> a[i][j];
  44.     for (int i = 0; i < m; ++i)
  45.         for (int j = 0; j < n; ++j)
  46.             if (IsWhite(i, j))
  47.             {
  48.                 int x = Encode(i, j);
  49.                 z.push_back(x);
  50.                 for (int d = 0; d < 8; ++d)
  51.                     if (Valid(i + dx[d], j + dy[d]))
  52.                         adj[x].push_back(Encode(i + dx[d], j + dy[d]));
  53.             }
  54.     fill_n(match, nvertices, -1);
  55. }
  56.  
  57. void DFS(int x)
  58. {
  59.     for (int y: adj[x])
  60.         if (avail[y])
  61.         {
  62.             avail[y] = false;
  63.             if (match[y] == -1) found = true;
  64.             else DFS(match[y]);
  65.             if (found)
  66.             {
  67.                 match[y] = x;
  68.                 return;
  69.             }
  70.         }
  71. }
  72.  
  73. void Solve()
  74. {
  75.     unsigned OldSize;
  76.     do
  77.     {
  78.         fill_n(avail, nvertices, true);
  79.         OldSize = z.size();
  80.         for (int i = z.size() - 1; i >= 0; --i)
  81.         {
  82.             found = false;
  83.             DFS(z[i]);
  84.             if (found)
  85.             {
  86.                 z[i] = z.back(); z.pop_back();
  87.             }
  88.         }
  89.     }
  90.     while (OldSize != z.size());
  91. }
  92.  
  93.  
  94. bool SelX[maxV], SelY[maxV];
  95. void GetRes()
  96. {
  97.     fill_n(avail, nvertices, true);
  98.     for (int x: z) DFS(x);
  99.     fill_n(SelY, nvertices, false);
  100.     int y;
  101.     for (int i = 0; i < m; ++i)
  102.         for (int j = 0; j < n; ++j)
  103.             if (IsBlack(i, j) && !avail[y = Encode(i, j)])
  104.                 SelY[y] = true;
  105.     fill_n(SelX, nvertices, false);
  106.     for (int i = 0; i < m; ++i)
  107.         for (int j = 0; j < n; ++j)
  108.             if (IsBlack(i, j) && match[y = Encode(i, j)] != -1)
  109.                 if (!SelY[y]) SelX[match[y]] = true;
  110.     int res = 0;
  111.     for (int i = 0; i < m; ++i)
  112.         for (int j = 0; j < n; ++j)
  113.             if (a[i][j] == '.')
  114.             {
  115.                 a[i][j] = 'K'; ++ res;
  116.             }
  117.     for (int i = 0; i < m; ++i)
  118.         for (int j = 0; j < n; ++j)
  119.         {
  120.             int k = Encode(i, j);
  121.             if (SelX[k] || SelY[k])
  122.             {
  123.                 a[i][j] = '.'; --res;
  124.             }
  125.         }
  126.     cout << res << '\n';
  127.     for (int i = 0; i < m; ++i, cout << '\n')
  128.         for (int j = 0; j < n; ++j) cout << a[i][j];
  129. }
  130.  
  131. int main()
  132. {
  133.     ios_base::sync_with_stdio(false);
  134.     cin.tie(nullptr);
  135.     freopen(taskname".inp", "r", stdin);
  136.     freopen(taskname".out", "w", stdout);
  137.     Enter();
  138.     Solve();
  139.     GetRes();
  140. }
  141.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement