Advertisement
mickypinata

TOI7: Sewer

Jun 22nd, 2021
792
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef pair<int, int> pii;
  5. typedef tuple<int, int, pii> tiip;
  6.  
  7. const int N = 100;
  8.  
  9. char board[N + 10][N + 10];
  10. int row, col;
  11. vector<vector<int>> dist;
  12. queue<tiip> que;
  13.  
  14. bool isInBoard(int r, int c){
  15.     return r >= 1 && r <= row && c >= 1 && c <= col;
  16. }
  17.  
  18. bool findCycle(int ur, int uc, int vr, int vc, pii &par){
  19.     if(dist[vr][vc] == -1){
  20.         dist[vr][vc] = dist[ur][uc] + 1;
  21.         que.emplace(vr, vc, pii(ur, uc));
  22.     } else if(pii(vr, vc) != par){
  23.         cout << dist[ur][uc] + 1 << '\n' << vr << ' ' << vc;
  24.         return true;
  25.     }
  26.     return false;
  27. }
  28.  
  29. int main(){
  30.  
  31.     scanf("%d%d", &row, &col);
  32.     for(int i = 1; i <= row; ++i){
  33.         for(int j = 1; j <= col; ++j){
  34.             scanf(" %c", &board[i][j]);
  35.         }
  36.     }
  37.  
  38.     dist.assign(row + 1, vector<int>(col + 1, -1));
  39.     dist[1][1] = 1;
  40.     que.emplace(1, 1, pii(0, 0));
  41.     while(!que.empty()){
  42.         int ur = get<0>(que.front());
  43.         int uc = get<1>(que.front());
  44.         pii par = get<2>(que.front());
  45.         que.pop();
  46.         if(board[ur][uc] == 'D'){ // DOWN
  47.             int vr = ur + 1;
  48.             int vc = uc;
  49.             if(isInBoard(vr, vc) && findCycle(ur, uc, vr, vc, par)){
  50.                 return 0;
  51.             }
  52.         } else if(board[ur][uc] == 'R'){ // RIGHT
  53.             int vr = ur;
  54.             int vc = uc + 1;
  55.             if(isInBoard(vr, vc) && findCycle(ur, uc, vr, vc, par)){
  56.                 return 0;
  57.             }
  58.         } else if(board[ur][uc] == 'B'){
  59.             // RIGHT
  60.             int vr = ur;
  61.             int vc = uc + 1;
  62.             if(isInBoard(vr, vc) && findCycle(ur, uc, vr, vc, par)){
  63.                 return 0;
  64.             }
  65.             // DOWN
  66.             vr = ur + 1;
  67.             vc = uc;
  68.             if(isInBoard(vr, vc) && findCycle(ur, uc, vr, vc, par)){
  69.                 return 0;
  70.             }
  71.         }
  72.         // UP
  73.         int vr = ur - 1;
  74.         int vc = uc;
  75.         if(isInBoard(vr, vc) && (board[vr][vc] == 'D' || board[vr][vc] == 'B') && findCycle(ur, uc, vr, vc, par)){
  76.             return 0;
  77.         }
  78.         // LEFT
  79.         vr = ur;
  80.         vc = uc - 1;
  81.         if(isInBoard(vr, vc) && (board[vr][vc] == 'R' || board[vr][vc] == 'B') && findCycle(ur, uc, vr, vc, par)){
  82.             return 0;
  83.         }
  84.     }
  85.  
  86.     return 0;
  87. }
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement