Advertisement
Josif_tepe

Untitled

Aug 5th, 2022
827
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.06 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. class ChessMaze {
  10. public:
  11.     int traverseMaze(vector<string> mat) {
  12.     memset(vis,0,sizeof vis);
  13.     int n,m;
  14.    
  15.         n = mat.size();
  16.         m = mat[0].size();
  17.     int si,sj,ei,ej;
  18.     int b=0;
  19.     for(int i=0;i<n;i++)
  20.     {
  21.         for(int j=0;j<m;j++)
  22.         {
  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.         ///obicno pesacenje
  68.         for(int i=0;i<4;i++)
  69.         {
  70.             int ti=di[i]+ci;
  71.             int tj=dj[i]+cj;
  72.             if(ti>=0&&ti<n&&tj>=0&&tj<m)
  73.             {
  74.                 if(mat[ti][tj]=='*')
  75.                 {
  76.                     continue;
  77.                 }
  78.                 if(mat[ti][tj]=='.')
  79.                 {
  80.                     if(!vis[ti][tj][k][kojk])
  81.                     {
  82.                         Q.push(ti);
  83.                         Q.push(tj);
  84.                         Q.push(k);
  85.                         Q.push(kojk);
  86.                         Q.push(kolku+1);
  87.                         vis[ti][tj][k][kojk]=true;
  88.                     }
  89.                 }
  90.                 if(mat[ti][tj]=='E')
  91.                 {
  92.                     return kolku + 1;
  93.                 }
  94.                 if(isdigit(mat[ti][tj]))
  95.                 {
  96.                     bool ok=kojk&(1<<(mat[ti][tj]-'0'));
  97.                     if(!ok)
  98.                     {
  99.                         int nkojk=kojk|(1<<(mat[ti][tj]-'0'));
  100.                         if(!vis[ti][tj][k+1][nkojk])
  101.                         {
  102.                             Q.push(ti);
  103.                             Q.push(tj);
  104.                             Q.push(k+1);
  105.                             Q.push(nkojk);
  106.                             Q.push(kolku+1);
  107.                             vis[ti][tj][k+1][nkojk]=true;
  108.                         }
  109.                     }
  110.                     else if(ok)
  111.                     {
  112.                         if(!vis[ti][tj][k][kojk])
  113.                         {
  114.                             Q.push(ti);
  115.                             Q.push(tj);
  116.                             Q.push(k);
  117.                             Q.push(kojk);
  118.                             Q.push(kolku+1);
  119.                             vis[ti][tj][k][kojk]=true;
  120.                         }
  121.                     }
  122.                 }
  123.             }
  124.         }
  125.         ///ako imamae konji
  126.         ///
  127.         if(k == 0) continue;
  128.         for(int i=0;i<8;i++)
  129.         {
  130.             int ti=ci+dik[i];
  131.             int tj=cj+djk[i];
  132.             if(ti>=n||ti<0||tj>=m||tj<0||mat[ti][tj]=='*')
  133.             {
  134.                 continue;
  135.             }
  136.             if(mat[ti][tj] == 'E') {
  137.                 return kolku + 1;
  138.             }
  139.             if(mat[ti][tj]=='.')
  140.             {
  141.                 if(!vis[ti][tj][k-1][kojk])
  142.                 {
  143.                     Q.push(ti);
  144.                     Q.push(tj);
  145.                     Q.push(k-1);
  146.                     Q.push(kojk);
  147.                     Q.push(kolku+1);
  148.                     vis[ti][tj][k-1][kojk]=true;
  149.                 }
  150.             }
  151.             if(isdigit(mat[ti][tj]))
  152.             {
  153.                 bool ok=kojk&(1<<(mat[ti][tj]-'0'));
  154.                 if(!ok)
  155.                 {
  156.                     int nkojk=kojk|(1<<(mat[ti][tj]-'0'));
  157.                     if(!vis[ti][tj][k][nkojk])
  158.                     {
  159.                         Q.push(ti);
  160.                         Q.push(tj);
  161.                         Q.push(k);
  162.                         Q.push(nkojk);
  163.                         Q.push(kolku+1);
  164.                         vis[ti][tj][k][nkojk]=true;
  165.                     }
  166.                 }
  167.                 else if(ok)
  168.                 {
  169.                     if(!vis[ti][tj][k-1][kojk])
  170.                     {
  171.                         Q.push(ti);
  172.                         Q.push(tj);
  173.                         Q.push(k-1);
  174.                         Q.push(kojk);
  175.                         Q.push(kolku+1);
  176.                         vis[ti][tj][k-1][kojk]=true;
  177.                     }
  178.                 }
  179.             }
  180.         }
  181.     }
  182.  
  183.     return -1;
  184.     }
  185. };
  186. /*
  187.  4 5
  188.  ...*.
  189.  ..***
  190.  ...K*
  191.  S*E**
  192.  
  193.  
  194.  **/
  195.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement