Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- enum dir {
- RIGHT = 0, LEFT = 1, DOWN = 2, UP = 3
- };
- typedef pair<int, int> pii;
- const int N = 300;
- pii direction[4] = {pii(0, 1), pii(0, -1), pii(1, 0), pii(-1, 0)};
- int board[N + 2][N + 2];
- int row, col;
- bool visitedRow[N + 2][2], visitedCol[N + 2][2];
- void visitedTrue(int r, int c){
- if(r == 0){
- visitedCol[c][0] = true;
- } else if(c == 0){
- visitedRow[r][0] = true;
- } else if(r == row + 1){
- visitedCol[c][1] = true;
- } else if(c == col + 1){
- visitedRow[r][1] = true;
- }
- }
- bool &visited(int r, int c){
- if(r == 0){
- return visitedCol[c][0];
- } else if(c == 0){
- return visitedRow[r][0];
- } else if(r == row + 1){
- return visitedCol[c][1];
- } else {
- return visitedRow[r][1];
- }
- }
- bool isInBoard(int r, int c){
- return r >= 0 && r <= row + 1 && c >= 0 && c <= col + 1;
- }
- int countPipe(int r, int c, dir d, int dist){
- visitedTrue(r, c);
- if(d == RIGHT){
- int vr = r + direction[RIGHT].first;
- int vc = c + direction[RIGHT].second;
- if(!isInBoard(vr, vc)){
- return dist;
- }
- if(board[vr][vc] == 11){
- return countPipe(vr, vc, UP, dist + 1);
- } else if(board[vr][vc] == 13){
- return countPipe(vr, vc, DOWN, dist + 1);
- } else if(board[vr][vc] == 22 || board[vr][vc] == 31){
- return countPipe(vr, vc, RIGHT, dist + 1);
- }
- } else if(d == LEFT){
- int vr = r + direction[LEFT].first;
- int vc = c + direction[LEFT].second;
- if(!isInBoard(vr, vc)){
- return dist;
- }
- if(board[vr][vc] == 12){
- return countPipe(vr, vc, UP, dist + 1);
- } else if(board[vr][vc] == 14){
- return countPipe(vr, vc, DOWN, dist + 1);
- } else if(board[vr][vc] == 22 || board[vr][vc] == 31){
- return countPipe(vr, vc, LEFT, dist + 1);
- }
- } else if(d == DOWN){
- int vr = r + direction[DOWN].first;
- int vc = c + direction[DOWN].second;
- if(!isInBoard(vr, vc)){
- return dist;
- }
- if(board[vr][vc] == 11){
- return countPipe(vr, vc, LEFT, dist + 1);
- } else if(board[vr][vc] == 12){
- return countPipe(vr, vc, RIGHT, dist + 1);
- } else if(board[vr][vc] == 21 || board[vr][vc] == 31){
- return countPipe(vr, vc, DOWN, dist + 1);
- }
- } else if(d == UP){
- int vr = r + direction[UP].first;
- int vc = c + direction[UP].second;
- if(!isInBoard(vr, vc)){
- return dist;
- }
- if(board[vr][vc] == 13){
- return countPipe(vr, vc, LEFT, dist + 1);
- } else if(board[vr][vc] == 14){
- return countPipe(vr, vc, RIGHT, dist + 1);
- } else if(board[vr][vc] == 21 || board[vr][vc] == 31){
- return countPipe(vr, vc, UP, dist + 1);
- }
- }
- return dist;
- }
- int main(){
- scanf("%d%d", &row, &col);
- for(int i = 1; i <= row; ++i){
- for(int j = 1; j <= col; ++j){
- scanf("%d", &board[i][j]);
- }
- }
- // Fill outline
- for(int i = 1; i <= row; ++i){
- if(board[i][1] == 11 || board[i][1] == 13 || board[i][1] == 22 || board[i][1] == 31){
- board[i][0] = 22;
- }
- }
- for(int i = 1; i <= row; ++i){
- if(board[i][col] == 12 || board[i][col] == 14 || board[i][col] == 22 || board[i][col] == 31){
- board[i][col + 1] = 22;
- }
- }
- for(int i = 1; i <= col; ++i){
- if(board[1][i] == 11 || board[1][i] == 12 || board[1][i] == 21 || board[1][i] == 31){
- board[0][i] = 21;
- }
- }
- for(int i = 1; i <= col; ++i){
- if(board[row][i] == 13 || board[row][i] == 14 || board[row][i] == 21 || board[row][i] == 31){
- board[row + 1][i] = 21;
- }
- }
- // Count Pipe
- vector<int> length;
- int cnt = 0;
- for(int i = 1; i <= col; ++i){
- if(!visited(0, i) && board[0][i] == 21){
- ++cnt;
- length.push_back(countPipe(0, i, DOWN, -1));
- }
- }
- for(int i = 1; i <= col; ++i){
- if(!visited(row + 1, i) && board[row + 1][i] == 21){
- ++cnt;
- length.push_back(countPipe(row + 1, i, UP, -1));
- }
- }
- for(int i = 1; i <= row; ++i){
- if(!visited(i, 0) && board[i][0] == 22){
- ++cnt;
- length.push_back(countPipe(i, 0, RIGHT, -1));
- }
- }
- for(int i = 1; i <= row; ++i){
- if(!visited(i, col + 1) && board[i][col + 1] == 22){
- ++cnt;
- length.push_back(countPipe(i, col + 1, LEFT, -1));
- }
- }
- cout << cnt << '\n';
- for(int x : length){
- cout << x << ' ';
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement