Advertisement
mickypinata

TOI9: Pipe

Jul 14th, 2021
1,051
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.84 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. enum dir {
  5.     RIGHT = 0, LEFT = 1, DOWN = 2, UP = 3
  6. };
  7.  
  8. typedef pair<int, int> pii;
  9.  
  10. const int N = 300;
  11.  
  12. pii direction[4] = {pii(0, 1), pii(0, -1), pii(1, 0), pii(-1, 0)};
  13. int board[N + 2][N + 2];
  14. int row, col;
  15. bool visitedRow[N + 2][2], visitedCol[N + 2][2];
  16.  
  17. void visitedTrue(int r, int c){
  18.     if(r == 0){
  19.         visitedCol[c][0] = true;
  20.     } else if(c == 0){
  21.         visitedRow[r][0] = true;
  22.     } else if(r == row + 1){
  23.         visitedCol[c][1] = true;
  24.     } else if(c == col + 1){
  25.         visitedRow[r][1] = true;
  26.     }
  27. }
  28.  
  29. bool &visited(int r, int c){
  30.     if(r == 0){
  31.         return visitedCol[c][0];
  32.     } else if(c == 0){
  33.         return visitedRow[r][0];
  34.     } else if(r == row + 1){
  35.         return visitedCol[c][1];
  36.     } else {
  37.         return visitedRow[r][1];
  38.     }
  39. }
  40.  
  41. bool isInBoard(int r, int c){
  42.     return r >= 0 && r <= row + 1 && c >= 0 && c <= col + 1;
  43. }
  44.  
  45. int countPipe(int r, int c, dir d, int dist){
  46.     visitedTrue(r, c);
  47.     if(d == RIGHT){
  48.         int vr = r + direction[RIGHT].first;
  49.         int vc = c + direction[RIGHT].second;
  50.         if(!isInBoard(vr, vc)){
  51.             return dist;
  52.         }
  53.         if(board[vr][vc] == 11){
  54.             return countPipe(vr, vc, UP, dist + 1);
  55.         } else if(board[vr][vc] == 13){
  56.             return countPipe(vr, vc, DOWN, dist + 1);
  57.         } else if(board[vr][vc] == 22 || board[vr][vc] == 31){
  58.             return countPipe(vr, vc, RIGHT, dist + 1);
  59.         }
  60.     } else if(d == LEFT){
  61.         int vr = r + direction[LEFT].first;
  62.         int vc = c + direction[LEFT].second;
  63.         if(!isInBoard(vr, vc)){
  64.             return dist;
  65.         }
  66.         if(board[vr][vc] == 12){
  67.             return countPipe(vr, vc, UP, dist + 1);
  68.         } else if(board[vr][vc] == 14){
  69.             return countPipe(vr, vc, DOWN, dist + 1);
  70.         } else if(board[vr][vc] == 22 || board[vr][vc] == 31){
  71.             return countPipe(vr, vc, LEFT, dist + 1);
  72.         }
  73.     } else if(d == DOWN){
  74.         int vr = r + direction[DOWN].first;
  75.         int vc = c + direction[DOWN].second;
  76.         if(!isInBoard(vr, vc)){
  77.             return dist;
  78.         }
  79.         if(board[vr][vc] == 11){
  80.             return countPipe(vr, vc, LEFT, dist + 1);
  81.         } else if(board[vr][vc] == 12){
  82.             return countPipe(vr, vc, RIGHT, dist + 1);
  83.         } else if(board[vr][vc] == 21 || board[vr][vc] == 31){
  84.             return countPipe(vr, vc, DOWN, dist + 1);
  85.         }
  86.     } else if(d == UP){
  87.         int vr = r + direction[UP].first;
  88.         int vc = c + direction[UP].second;
  89.         if(!isInBoard(vr, vc)){
  90.             return dist;
  91.         }
  92.         if(board[vr][vc] == 13){
  93.             return countPipe(vr, vc, LEFT, dist + 1);
  94.         } else if(board[vr][vc] == 14){
  95.             return countPipe(vr, vc, RIGHT, dist + 1);
  96.         } else if(board[vr][vc] == 21 || board[vr][vc] == 31){
  97.             return countPipe(vr, vc, UP, dist + 1);
  98.         }
  99.     }
  100.     return dist;
  101. }
  102.  
  103. int main(){
  104.  
  105.     scanf("%d%d", &row, &col);
  106.     for(int i = 1; i <= row; ++i){
  107.         for(int j = 1; j <= col; ++j){
  108.             scanf("%d", &board[i][j]);
  109.         }
  110.     }
  111.  
  112.     // Fill outline
  113.     for(int i = 1; i <= row; ++i){
  114.         if(board[i][1] == 11 || board[i][1] == 13 || board[i][1] == 22 || board[i][1] == 31){
  115.             board[i][0] = 22;
  116.         }
  117.     }
  118.     for(int i = 1; i <= row; ++i){
  119.         if(board[i][col] == 12 || board[i][col] == 14 || board[i][col] == 22 || board[i][col] == 31){
  120.             board[i][col + 1] = 22;
  121.         }
  122.     }
  123.     for(int i = 1; i <= col; ++i){
  124.         if(board[1][i] == 11 || board[1][i] == 12 || board[1][i] == 21 || board[1][i] == 31){
  125.             board[0][i] = 21;
  126.         }
  127.     }
  128.     for(int i = 1; i <= col; ++i){
  129.         if(board[row][i] == 13 || board[row][i] == 14 || board[row][i] == 21 || board[row][i] == 31){
  130.             board[row + 1][i] = 21;
  131.         }
  132.     }
  133.  
  134.     // Count Pipe
  135.     vector<int> length;
  136.     int cnt = 0;
  137.     for(int i = 1; i <= col; ++i){
  138.         if(!visited(0, i) && board[0][i] == 21){
  139.             ++cnt;
  140.             length.push_back(countPipe(0, i, DOWN, -1));
  141.         }
  142.     }
  143.     for(int i = 1; i <= col; ++i){
  144.         if(!visited(row + 1, i) && board[row + 1][i] == 21){
  145.             ++cnt;
  146.             length.push_back(countPipe(row + 1, i, UP, -1));
  147.         }
  148.     }
  149.     for(int i = 1; i <= row; ++i){
  150.         if(!visited(i, 0) && board[i][0] == 22){
  151.             ++cnt;
  152.             length.push_back(countPipe(i, 0, RIGHT, -1));
  153.         }
  154.     }
  155.     for(int i = 1; i <= row; ++i){
  156.         if(!visited(i, col + 1) && board[i][col + 1] == 22){
  157.             ++cnt;
  158.             length.push_back(countPipe(i, col + 1, LEFT, -1));
  159.         }
  160.     }
  161.     cout << cnt << '\n';
  162.     for(int x : length){
  163.         cout << x << ' ';
  164.     }
  165.  
  166.     return 0;
  167. }
  168.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement