Advertisement
Josif_tepe

Untitled

Jul 31st, 2022
1,201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <queue>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. bool visited[22][22][1 << 8];
  8. int main()
  9. {
  10.     memset(visited, false, sizeof visited);
  11.     int n, m;
  12.     cin >> n >> m;
  13.    
  14.     char mat[n][m];
  15.     int si, sj, ei, ej;
  16.     for(int i = 0; i < n; i++) {
  17.         for(int j = 0; j < m; j++) {
  18.             cin >> mat[i][j];
  19.             if(mat[i][j] == 'P') {
  20.                 si = i;
  21.                 sj = j;
  22.             }
  23.             if(mat[i][j] == 'K') {
  24.                 ei = i;
  25.                 ej = j;
  26.             }
  27.         }
  28.     }
  29.     queue<int> Q;
  30.     Q.push(si);
  31.     Q.push(sj);
  32.     Q.push(0); // ova ni e maska za da znaeme koi klucevi gi imame momentalno zemeno
  33.     Q.push(0); // kolku cekori sme napravile do sega
  34.    
  35.     visited[si][sj][0] = true;
  36.    
  37.     int di[] = {-1, 1, 0, 0};
  38.     int dj[] = {0, 0, -1, 1};
  39.     while(!Q.empty()) {
  40.         int ci = Q.front();
  41.         Q.pop();
  42.         int cj = Q.front();
  43.         Q.pop();
  44.         int keys = Q.front();
  45.         Q.pop();
  46.         int cekor = Q.front();
  47.         Q.pop();
  48.        
  49.         if(ci == ei and cj == ej) {
  50.             cout << cekor << endl;
  51.             return 0;
  52.         }
  53.         for(int i = 0; i < 4; i++) {
  54.             int ti = ci + di[i];
  55.             int tj = cj + dj[i];
  56.             if(ti >= 0 and ti < n and tj >= 0 and tj < m) {
  57.                 if(mat[ti][tj] == '#') {
  58.                     continue;
  59.                 }
  60.                 if(mat[ti][tj] == '.' or mat[ti][tj] == 'K') {
  61.                     if(!visited[ti][tj][keys]) {
  62.                         Q.push(ti);
  63.                         Q.push(tj);
  64.                         Q.push(keys);
  65.                         Q.push(cekor + 1);
  66.                         visited[ti][tj][keys] = true;
  67.                     }
  68.                 }
  69.                 if(mat[ti][tj] >= 'a' and mat[ti][tj] <= 'h') { // sme stapnale na kluc
  70.                     int key_index = (mat[ti][tj] - 'a');
  71.                     int new_keys = keys | (1 << key_index);
  72.                     if(!visited[ti][tj][new_keys]) {
  73.                         Q.push(ti);
  74.                         Q.push(tj);
  75.                         Q.push(new_keys);
  76.                         Q.push(cekor + 1);
  77.                         visited[ti][tj][new_keys] = true;
  78.                     }
  79.                 }
  80.                 if(mat[ti][tj] >= 'A' and mat[ti][tj] <= 'H') {
  81.                     int key_index = (mat[ti][tj] - 'A');
  82.                     if(keys & (1 << key_index)) {
  83.                         if(!visited[ti][tj][keys]) {
  84.                             Q.push(ti);
  85.                             Q.push(tj);
  86.                             Q.push(keys);
  87.                             Q.push(cekor + 1);
  88.                             visited[ti][tj][keys] = true;
  89.                         }
  90.                     }
  91.                 }
  92.             }
  93.         }
  94.        
  95.     }
  96.     cout << -1 << endl;
  97.     return 0;
  98. }
  99. /*
  100.  5 5
  101.  P..#a
  102.  A....
  103.  .####
  104.  K....
  105.  #####
  106.  
  107.  10 10
  108.  P.....d..f
  109.  ####F#D###
  110.  ..........
  111.  ......h..b
  112.  .#####H###
  113.  .#....a...
  114.  .#.###A###
  115.  .#.#...c..
  116.  .#.#.####C
  117.  .B.#.#...K
  118.  
  119. 3 3
  120. P.A
  121. ##a
  122. K..
  123.  
  124.  **/
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement