Advertisement
SuitNdtie

CUBE-122: COI Board Game !

May 28th, 2019
115
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.97 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<queue>
  3. using namespace std;
  4. int n,m;
  5.  
  6. struct pos{
  7.     int I,J;
  8.     pos operator + (const pos& rhs)const
  9.     {
  10.         return {I + rhs.I , J + rhs.J};
  11.     }
  12. };
  13.  
  14. bool isinbound(pos p){
  15.     return ( (0 <= p.I && p.I < n ) && (0 <= p.J && p.J < m) );
  16. }
  17.  
  18. struct elem{
  19.     int key;
  20.     pos now;
  21. };
  22.  
  23. int min(int a,int b)
  24. {
  25.     return (a < b ? a : b);
  26. }
  27. int main()
  28. {
  29.    
  30.     scanf("%d %d",&n,&m);
  31.     char board[n][m+1];
  32.     for(int i = 0 ; i < n ; i ++){
  33.         scanf(" %s",board[i]);
  34.     }
  35.     pos begin , end;
  36.     for(int i = 0 ; i< n ; i ++){
  37.         for(int j = 0 ; j < m ; j ++){
  38.             if(board[i][j] == 'S'){
  39.                 begin.I = i;
  40.                 begin.J = j;
  41.             }
  42.             if(board[i][j] == 'E'){
  43.                 end.I = i;
  44.                 end.J = j;
  45.             }
  46.         }
  47.     }
  48.    
  49.     bool visited[8][n][m]; // J = 1(1<<0) , B = 2(1<<1) , P = 4(1<<2) , JB = 3 , JP = 5 , BP = 6 , JBP = 7
  50.     int dist[8][n][m];
  51.     for(int key = 0 ; key < 8 ; key ++){ //
  52.         for(int i = 0 ; i < n ; i ++){
  53.             for(int j = 0 ; j < m ; j ++){
  54.                 visited[key][i][j] = false;
  55.                 dist[key][i][j] = 1e9;
  56.             }
  57.         }
  58.     }
  59.     dist[0][begin.I][begin.J] = 0;
  60.     queue<elem> q;
  61.     q.push({0,{begin.I , begin.J} });
  62.    
  63.     while(!q.empty()){
  64.         int key = q.front().key;
  65.         pos now = q.front().now;
  66.         q.pop();
  67.     /*  if(visited[key][now.I][now.J])continue;
  68.         visited[key][now.I][now.J] = true;*/
  69.        
  70.     //  printf("Test at (%d,%d) with #%d key \n",now.I,now.J,key);
  71.         pos move[4] = { {-1,0} , {0,1} , {1,0} , {0,-1} };
  72.         for(int i = 0 ; i < 4 ; i ++){
  73.             pos nxt = now + move[i];
  74.             if(isinbound(nxt))
  75.             {
  76.             //  if(visited[key][nxt.I][nxt.J])continue;
  77.                
  78.                 char nxtonB = board[nxt.I][nxt.J];
  79.                 if(nxtonB == '#'){
  80.                     continue;
  81.                 }
  82.                 else if(nxtonB == '.' || nxtonB == 'S'){
  83.                     if(dist[key][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  84.                         dist[key][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  85.                         q.push({key,nxt});
  86.                     }
  87.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  88.                 }
  89.                 else if(nxtonB == 'j'){ // get j key
  90.                     if(dist[key|(1<<0)][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  91.                         dist[key|(1<<0)][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  92.                         q.push({key|(1<<0),nxt});
  93.                     }
  94.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  95.                 }
  96.                 else if(nxtonB == 'b'){ // get b key
  97.                     if(dist[key|(1<<1)][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  98.                         dist[key|(1<<1)][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  99.                         q.push({key|(1<<1),nxt});
  100.                     }
  101.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  102.                 }
  103.                 else if(nxtonB == 'p'){ // get p key
  104.                     if(dist[key|(1<<2)][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  105.                         dist[key|(1<<2)][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  106.                         q.push({key|(1<<2),nxt});
  107.                     }
  108.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  109.                 }
  110.                 else if(nxtonB == 'J' && (key&(1<<0))){ //have J key
  111.                     if(dist[key][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  112.                         dist[key][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  113.                         q.push({key,nxt});
  114.                     }
  115.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  116.                 }
  117.                 else if(nxtonB == 'B' && (key&(1<<1))){ //have B key
  118.                     if(dist[key][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  119.                         dist[key][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  120.                         q.push({key,nxt});
  121.                     }
  122.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  123.                 }
  124.                 else if(nxtonB == 'P' && (key&(1<<2))){ //have P key
  125.                     if(dist[key][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  126.                         dist[key][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  127.                         q.push({key,nxt});
  128.                     }
  129.             //      printf("go to (%d,%d)\n",nxt.I,nxt.J);
  130.                 }
  131.                 else if(nxtonB == 'E'){
  132.                     if(dist[key][nxt.I][nxt.J] > dist[key][now.I][now.J] + 1){
  133.                         dist[key][nxt.I][nxt.J] = dist[key][now.I][now.J] + 1;
  134.                     }
  135.             //      printf("Test goal cost : %d\n",dist[key][nxt.I][nxt.J]);
  136.                     break;
  137.                 }
  138.             }
  139.         }
  140.     }
  141.     int ans = 1e9;
  142.     for(int i = 0 ; i < 8 ; i ++){
  143.     //  printf("checking #%d with %d < %d ? \n",i,dist[i][end.I][end.J],ans);
  144.         ans = min(ans,dist[i][end.I][end.J]);
  145.     }
  146.     printf("%d",(ans == 1e9 ? -1 : ans));
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement