Alex_tz307

JocDeSah - 85p

Sep 26th, 2020 (edited)
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.03 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define x first
  3. #define y second
  4. #define INF 0x3f3f3f3f
  5.  
  6. using namespace std;
  7.  
  8. ifstream fin("jocdesah.in");
  9. ofstream fout("jocdesah.out");
  10.  
  11. struct heap {
  12.     int lives, distance, lin, col, mask;
  13.     bool operator < (const heap& A) const {
  14.         if(lives != A.lives)
  15.             return lives < A.lives;
  16.         if(distance != A.distance)
  17.             return distance > A.distance;
  18.         if(lin != A.lin)
  19.             return lin > A.lin;
  20.         return col > A.col;
  21.     }
  22. };
  23.  
  24. const int di[] = {-1, 0, 0, 1},
  25.           dj[] = {0, -1, 1, 0};
  26.  
  27. inline bool Less(const pair < int , int >& a, const pair < int , int >& b) {
  28.     return a.x < b.x || (a.x == b.x && a.y < b.y);
  29. }
  30.  
  31. int main() {
  32.     int task, N;
  33.     fin >> task >> N;
  34.     vector < string > a(N + 1);
  35.     for(int i = 1; i <= N; ++i) {
  36.         fin >> a[i];
  37.         a[i] = '0' + a[i];
  38.     }
  39.     vector < pair < int , int > > king;
  40.     for(int i = 1; i <= N; ++i)
  41.         for(int j = 1; j <= N; ++j)
  42.             if(a[i][j] == 'K')
  43.                 king.emplace_back(i, j);
  44.     int ans = 0;
  45.     vector < char > piese{'P', 'C', 'N', 'T'};
  46.     auto inside = [&](int lin, int col) {
  47.         return lin > 0 && col > 0 && lin <= N && col <= N;
  48.     };
  49.     int last_lin = -1, last_col = -1, dist = -1;
  50.     vector < vector < pair < int , int > > > last(N + 1, vector < pair < int , int > >(N + 1));
  51.     for(auto it : king) {
  52.         priority_queue < heap > Q;
  53.         Q.push(heap{16, 1, it.x, it.y, 15});
  54.         vector < vector < bool > > viz(N + 1, vector < bool >(N + 1));
  55.         viz[it.x][it.y] = true;
  56.         vector < vector < pair < int , int > > > from(N + 1, vector < pair < int , int > >(N + 1, make_pair(INF, INF)));
  57.         bool ok = false, flag = true;
  58.         while(!Q.empty() && flag) {
  59.             int lives = Q.top().lives,
  60.                 distance = Q.top().distance,
  61.                 lin = Q.top().lin,
  62.                 col = Q.top().col,
  63.                 mask = Q.top().mask;
  64.             Q.pop();
  65.             for(int k = 0; k < 4; ++k) {
  66.                 int iv = lin + di[k],
  67.                     jv = col + dj[k];
  68.                 if(inside(iv, jv) && !viz[iv][jv] && a[iv][jv] != 'K') {
  69.                     viz[iv][jv] = true;
  70.                     pair < int , int > p = make_pair(lin, col);
  71.                     if(Less(p, from[iv][jv]))
  72.                         from[iv][jv] = p;
  73.                     for(int i = 0; i < 4; ++i)
  74.                         if(a[iv][jv] == piese[i]) {
  75.                             int new_lives = lives,
  76.                                 new_mask = mask;
  77.                             if(mask & (1 << i)) {
  78.                                 new_mask ^= (1 << i);
  79.                                 new_lives -= (1 << i);
  80.                             }
  81.                             Q.push(heap{new_lives, distance + 1, iv, jv, new_mask});
  82.                         }
  83.                     if(a[iv][jv] == 'Q') {
  84.                         if(lives > ans) {
  85.                             ans = lives;
  86.                             dist = distance + 1;
  87.                             last_lin = iv;
  88.                             last_col = jv;
  89.                             ok = true;
  90.                         }
  91.                         flag = false;
  92.                         Q.push(heap{lives, distance + 1, iv, jv, mask});
  93.                     }
  94.                 }
  95.             }
  96.         }
  97.         if(ok)
  98.             for(int i = 0; i <= N; ++i)
  99.                 for(int j = 0; j <= N; ++j)
  100.                     last[i][j] = from[i][j];
  101.     }
  102.     if(task == 1)
  103.         fout << ans;
  104.     else {
  105.         fout << dist << '\n';
  106.         vector < pair < int , int > > sol;
  107.         while(last_lin != INF && last_col != INF) {
  108.             sol.emplace_back(last_lin, last_col);
  109.             int l = last_lin,
  110.                 c = last_col;
  111.             last_lin = last[l][c].x;
  112.             last_col = last[l][c].y;
  113.         }
  114.         reverse(sol.begin(), sol.end());
  115.         for(auto it : sol)
  116.             fout << it.x << ' ' << it.y << '\n';
  117.     }
  118. }
  119.  
Add Comment
Please, Sign In to add comment