Advertisement
mickypinata

PROG-T1011: Block Game

Apr 5th, 2020
325
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. #define pii pair<int, int>
  7. #define r first
  8. #define c second
  9.  
  10. /// R D
  11. pii ctrl[2] = {{0, 1}, {1, 0}};
  12. vector<vector<char>> board;
  13. int row, col, q, score;
  14.  
  15. void PrintBoard(){
  16.     for(int i = 1; i <= row; ++i){
  17.         for(int j = 1; j <= col; ++j){
  18.             cout << board[i][j] << " ";
  19.         }
  20.         cout << "\n";
  21.     }
  22.     return;
  23. }
  24.  
  25. void FalltoBelow(pii s){
  26.     if(board[s.r][s.c] != '-'){
  27.         return;
  28.     }
  29.     int r = s.r - 1;
  30.     int c = s.c;
  31.     while(r > 0 && board[r][c] != '#' && board[r][c] != '-'){
  32.         swap(board[r][c], board[r + 1][c]);
  33.         --r;
  34.     }
  35.     return;
  36. }
  37.  
  38. pii FallfromAbove(pii s){
  39.     if(board[s.r][s.c] == '-' || board[s.r][s.c] == '#'){
  40.         return s;
  41.     }
  42.     int r = s.r + 1;
  43.     int c = s.c;
  44.     while(r <= row && board[r][c] == '-'){
  45.         swap(board[r][c], board[r - 1][c]);
  46.         ++r;
  47.     }
  48.     return {r - 1, c};
  49. }
  50.  
  51. void BFS(pii s){
  52.     vector<pii> fall;
  53.     queue<pii> q;
  54.     fall.push_back(s);
  55.     q.push(s);
  56.     char t = board[s.r][s.c];
  57.     board[s.r][s.c] = '-';
  58.     score += 5;
  59.     while(!q.empty()){
  60.         int r = q.front().r;
  61.         int c = q.front().c;
  62.         q.pop();
  63.         for(int i = 0; i < 2; ++i){
  64.             int nr = r + ctrl[i].r;
  65.             int nc = c + ctrl[i].c;
  66.             if(nr <= row && nc <= col && board[nr][nc] == t){
  67.                 q.push({nr, nc});
  68.                 fall.push_back({nr, nc});
  69.                 board[nr][nc] = '-';
  70.                 score += 5;
  71.             }
  72.         }
  73.     }
  74.     for(auto x : fall){
  75.         FalltoBelow(x);
  76.     }
  77.     return;
  78. }
  79.  
  80. int main(){
  81.  
  82.     int r, c;
  83.     char cmd;
  84.  
  85.     /// Get board
  86.     scanf("%d %d", &row, &col);
  87.     board.assign(row + 2, vector<char>(col + 2, '\0'));
  88.     for(int i = 1; i <= row; ++i){
  89.         for(int j = 1; j <= col; ++j){
  90.             scanf(" %c", &cmd);
  91.             board[i][j] = cmd;
  92.         }
  93.     }
  94.  
  95.     scanf("%d", &q);
  96.     score = 0;
  97.     for(int i = 0; i < q; ++i){
  98.         scanf("%d %d %c", &r, &c, &cmd);
  99.         ++r;
  100.         ++c;
  101.  
  102.         /// Move L or R
  103.         pii start = {r, c};
  104.         pii target;
  105.         switch(cmd){
  106.         case 'L':
  107.             target = {r, c - 1};
  108.             break;
  109.         case 'R':
  110.             target = {r, c + 1};
  111.             break;
  112.         }
  113.  
  114.         /// Invalid moves
  115.         if(target.c < 0 || target.c >= col || board[r][c] == '-' || board[r][c] == '#' || board[r][target.c] != '-'){
  116.             score -= 5;
  117.             continue;
  118.         }
  119.  
  120.         /// Fall
  121.         board[target.r][target.c] = board[start.r][start.c];
  122.         board[start.r][start.c] = '-';
  123.         target = FallfromAbove(target);
  124.         FalltoBelow(start);
  125.  
  126.         /// Check blocks to destroy
  127.         bool change = true;
  128.         while(change){
  129.             change = false;
  130.             for(int j = 1; j <= row; ++j){
  131.                 for(int k = 1; k <= col; ++k){
  132.                     for(int a = 0; a < 2; ++a){ /// Check R and D
  133.                         int cr = j + ctrl[a].r;
  134.                         int cc = k + ctrl[a].c;
  135.                         if(board[j][k] != '-' && board[j][k] != '#' && cr <= row && cc <= col && board[j][k] == board[cr][cc]){
  136.                             change = true;
  137.                             BFS({j, k});
  138.                         }
  139.                     }
  140.                 }
  141.             }
  142.         }
  143.     }
  144.     cout << score << "\n";
  145.     PrintBoard();
  146.  
  147.     return 0;
  148. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement