Advertisement
Josif_tepe

Untitled

Aug 5th, 2022
976
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.41 KB | None | 0 0
  1.  
  2.     #include <iostream>
  3. #include <queue>
  4. #include <cstring>
  5. using namespace std;
  6.  
  7. bool vis[16][16][15][(1<<10)];
  8.  
  9. int main() {
  10.     memset(vis,0,sizeof vis);
  11.     int n,m;
  12.     cin >> n >> m;
  13.     char mat[n][m];
  14.        
  15.        
  16.     int si,sj,ei,ej;
  17.     int b=0;
  18.     for(int i=0;i<n;i++)
  19.     {
  20.         for(int j=0;j<m;j++)
  21.         {
  22.             cin >> mat[i][j];
  23.             if(mat[i][j]=='S')
  24.             {
  25.                 si=i;
  26.                 sj=j;
  27.             }
  28.             if(mat[i][j]=='E')
  29.             {
  30.                 ei=i;
  31.                 ej=j;
  32.             }
  33.             if(mat[i][j]=='K')
  34.             {
  35.                 mat[i][j]= (b+'0');
  36.                 b++;
  37.             }
  38.         }
  39.     }
  40.     queue<int>Q;
  41.     Q.push(si);
  42.     Q.push(sj);
  43.     Q.push(0);///K
  44.     Q.push(0);///kojK
  45.     Q.push(0);///kolku
  46.     vis[si][sj][0][0]=true;
  47.     int di[4]={1,-1,0,0};
  48.     int dj[4]={0,0,-1,1};
  49.     int dik[8]={-1,-1,1,1,2,2,-2,-2};
  50.     int djk[8]={-2,2,-2,2,-1,1,-1,1};
  51.     while(!Q.empty())
  52.     {
  53.         int ci=Q.front();
  54.         Q.pop();
  55.         int cj=Q.front();
  56.         Q.pop();
  57.         int k=Q.front();
  58.         Q.pop();
  59.         int kojk=Q.front();
  60.         Q.pop();
  61.         int kolku=Q.front();
  62.         Q.pop();
  63.         if(ci==ei && cj==ej)
  64.         {
  65.             return kolku;
  66.         }
  67.         for(int i = 0; i < 4; i++) {
  68.             int ti = di[i] + ci;
  69.             int tj = dj[i] + cj;
  70.            
  71.             if(ti >= 0 and ti < n and tj >= 0 and tj < m and mat[ti][tj] != '*') {
  72.                 int new_k = k;
  73.                 int new_mask = kojk;
  74.                 if(isdigit(mat[ti][tj])) {
  75.                     int d = (mat[ti][tj] - '0');
  76.                     if(new_mask & (1 << d)) {
  77.                        
  78.                     }
  79.                     else {
  80.                         new_mask |= (1 << d);
  81.                         new_k++;
  82.                     }
  83.                 }
  84.                 if(!vis[ti][tj][new_k][new_mask]) {
  85.                     Q.push(ti);
  86.                     Q.push(tj);
  87.                     Q.push(new_k);
  88.                     Q.push(new_mask);
  89.                     Q.push(kolku + 1);
  90.                     vis[ti][tj][new_k][new_mask] = true;
  91.                 }
  92.             }
  93.         }
  94.         if(k > 0) {
  95.             for(int i =0; i < 8; i++) {
  96.                 int ti = ci + dik[i];
  97.                 int tj = cj + djk[i];
  98.                 if(ti >= 0 and ti < n and tj >= 0  and tj < m and mat[ti][tj] != '*') {
  99.                     int new_k = k - 1;
  100.                     int new_mask = kojk;
  101.                     if(isdigit(mat[ti][tj])) {
  102.                         int d = (mat[ti][tj] - '0');
  103.                         if(new_mask & (1 << d)) {
  104.                            
  105.                         }
  106.                         else {
  107.                             new_mask |= (1 << d);
  108.                             new_k++;
  109.                         }
  110.                     }
  111.                     if(!vis[ti][tj][new_k][new_mask]) {
  112.                         Q.push(ti);
  113.                         Q.push(tj);
  114.                         Q.push(new_k);
  115.                         Q.push(new_mask);
  116.                         Q.push(kolku + 1);
  117.                         vis[ti][tj][new_k][new_mask] = true;                    }
  118.                 }
  119.             }
  120.         }
  121.     }
  122.     cout << -1 << endl;
  123.     return 0;
  124.     }
  125.  
  126. /*
  127.  4 5
  128.  ...*.
  129.  ..***
  130.  ...K*
  131.  S*E**
  132.  
  133.  
  134.  **/
  135.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement