Advertisement
mickypinata

CUBE-T122: COI Board Game!

Mar 30th, 2020
185
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. typedef long long lli;
  6.  
  7. typedef struct coor{
  8.     int r;
  9.     int c;
  10. }coor;
  11.  
  12. typedef struct vstate{
  13.     int r;
  14.     int c;
  15.     int st; /// st[0] = J st[1] = B st[2] = P
  16. }vstate;
  17.  
  18. /// U R D L
  19. coor ctrl[4] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
  20. vector<vector<char>> board;
  21. int row, col;
  22.  
  23. lli BFS(coor s, coor e){
  24.     vector<vector<vector<lli>>> dist(row, vector<vector<lli>>(col, vector<lli>(8, -1)));
  25.     queue<vstate> q;
  26.     dist[s.r][s.c][0] = 0;
  27.     q.push({s.r, s.c, 0});
  28.     while(!q.empty()){
  29.         int ur = q.front().r;
  30.         int uc = q.front().c;
  31.         int st = q.front().st;
  32.         q.pop();
  33.         for(int i = 0; i < 4; ++i){
  34.             int vr = ur + ctrl[i].r;
  35.             int vc = uc + ctrl[i].c;
  36.             if(vr >= 0 && vr < row && vc >= 0 && vc < col){ // Inside Board
  37.                 if(dist[vr][vc][st] == -1 && board[vr][vc] != '#'){
  38.                     switch(board[vr][vc]){
  39.                     case '.': case 'S':
  40.                         dist[vr][vc][st] = dist[ur][uc][st] + 1;
  41.                         q.push({vr, vc, st});
  42.                         break;
  43.                     case 'J':
  44.                         if((st & 1) != 0){ // is 001 011 101 111
  45.                             dist[vr][vc][st] = dist[ur][uc][st] + 1;
  46.                             q.push({vr, vc, st});
  47.                         }
  48.                         break;
  49.                     case 'B':
  50.                         if((st & (1 << 1)) != 0){ // is 010 011 110 111
  51.                             dist[vr][vc][st] = dist[ur][uc][st] + 1;
  52.                             q.push({vr, vc, st});
  53.                         }
  54.                         break;
  55.                     case 'P':
  56.                         if((st & (1 << 2)) != 0){ // is 100 110 101 111
  57.                             dist[vr][vc][st] = dist[ur][uc][st] + 1;
  58.                             q.push({vr, vc, st});
  59.                         }
  60.                         break;
  61.                     case 'j':
  62.                         dist[vr][vc][(st | 1)] = dist[ur][uc][st] + 1;
  63.                         dist[vr][vc][st] = dist[ur][uc][st] + 1;
  64.                         q.push({vr, vc, (st | 1)}); // Add 001 to st
  65.                         break;
  66.                     case 'b':
  67.                         dist[vr][vc][(st | (1 << 1))] = dist[ur][uc][st] + 1;
  68.                         dist[vr][vc][st] = dist[ur][uc][st] + 1;
  69.                         q.push({vr, vc, (st | (1 << 1))}); // Add 010 to st
  70.                         break;
  71.                     case 'p':
  72.                         dist[vr][vc][(st | (1 << 2))] = dist[ur][uc][st] + 1;
  73.                         dist[vr][vc][st] = dist[ur][uc][st] + 1;
  74.                         q.push({vr, vc, (st | (1 << 2))}); // Add 100 to st
  75.                         break;
  76.                     case 'E':
  77.                         return dist[ur][uc][st] + 1;
  78.                         break;
  79.                     }
  80.                 }
  81.             }
  82.         }
  83.     }
  84.     return -1;
  85. }
  86.  
  87. int main(){
  88.  
  89.     char x;
  90.     coor s, e;
  91.  
  92.     scanf("%d %d", &row, &col);
  93.     board.assign(row + 1, vector<char>(col + 1, '\0'));
  94.     for(int i = 0; i < row; ++i){
  95.         for(int j = 0; j < col; ++j){
  96.             scanf(" %c", &x);
  97.             board[i][j] = x;
  98.             if(x == 'S'){
  99.                 s = {i, j};
  100.             } else if(x == 'E'){
  101.                 e = {i, j};
  102.             }
  103.         }
  104.     }
  105.     cout << BFS(s, e);
  106.  
  107.     return 0;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement