Advertisement
Vince14

Lasers and Mirrors

Feb 12th, 2023 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.90 KB | Source Code | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <cmath>
  5. #include <vector>
  6. #include <set>
  7. #include <map>
  8. #include <stack>
  9. #include <queue>
  10. #include <deque>
  11. #include <unordered_map>
  12. #include <numeric>
  13. #include <iomanip>
  14. using namespace std;
  15. #define pii pair<int, int>
  16. #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
  17. const int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
  18. const int MOD = 1e9;
  19. const int MAX = 100005;
  20.  
  21. int n;
  22. pii laser, barn;
  23. vector<pii> mirror;
  24. vector<int> x_comp, y_comp;
  25. vector<int> coords[MAX][2]; // 0 = x, 1 = y
  26. int visitedx[MAX][2], visitedy[MAX][2];
  27.  
  28. struct vertex{
  29.     int x, y, dir, dist;
  30.     void print(){
  31.         cout << "Pushed to queue: " << x << " " << y << " " << dir << " " << dist << "\n";
  32.     }
  33. };
  34.  
  35. int main() {
  36.     FAST;
  37.     freopen("lasers.in", "r", stdin);
  38.     freopen("lasers.out", "w", stdout);
  39.     cin >> n >> laser.first >> laser.second >> barn.first >> barn.second;
  40.     mirror.resize(n + 2);
  41.     for(int i = 0; i < n + 2; i++){
  42.         if(i == n){
  43.             mirror[i] = laser;
  44.         }
  45.         else if(i == n + 1){
  46.             mirror[i] = barn;
  47.         }
  48.         else{
  49.             cin >> mirror[i].first >> mirror[i].second;
  50.         }
  51.         x_comp.push_back(mirror[i].first); y_comp.push_back(mirror[i].second);
  52.     }
  53.     // Coordinate Compression
  54.     sort( x_comp.begin(), x_comp.end() );
  55.     x_comp.erase( unique( x_comp.begin(), x_comp.end() ), x_comp.end() );
  56.     sort( y_comp.begin(), y_comp.end() );
  57.     y_comp.erase( unique( y_comp.begin(), y_comp.end() ), y_comp.end() );
  58.     for(int i = 0; i < n + 2; i++){
  59.         mirror[i].first = (int)(lower_bound(x_comp.begin(), x_comp.end(), mirror[i].first) - x_comp.begin());
  60.         mirror[i].second = (int)(lower_bound(y_comp.begin(), y_comp.end(), mirror[i].second) - y_comp.begin());
  61.         // cout << mirror[i].first << " " << mirror[i].second << "\n";
  62.         coords[mirror[i].second][0].push_back(mirror[i].first);
  63.         coords[mirror[i].first][1].push_back(mirror[i].second);
  64.     }
  65.     laser = mirror[n];
  66.     barn = mirror[n + 1];
  67.     queue<vertex> q;
  68.     vertex init;
  69.     init.x = laser.first;
  70.     init.y = laser.second;
  71.     init.dir = 0;
  72.     init.dist = 0;
  73.     vertex init2 = init;
  74.     init2.dir = 1;
  75.     q.push(init);
  76.     q.push(init2);
  77.     int ans = 2e9;
  78.     while(!q.empty()){
  79.         vertex cur = q.front();
  80.         q.pop();
  81.         int curx = cur.x, cury = cur.y, cur_dir = cur.dir, cur_dist = cur.dist;
  82.         // cout << "BFS: " << curx << " " << cury << " " << cur_dir << " " << cur_dist << "\n";
  83.         if(!(curx == laser.first and cury == laser.second)){
  84.             visitedx[curx][cur_dir] = 1;
  85.             visitedy[cury][cur_dir] = 1;
  86.         }
  87.         if(curx == barn.first or cury == barn.second){
  88.             ans = min(ans, cur_dist);
  89.         }
  90.         if(cur_dir == 0){
  91.             for(auto nxtx: coords[cury][cur_dir]){
  92.                 vertex nxt;
  93.                 nxt.x = nxtx;
  94.                 nxt.y = cury;
  95.                 nxt.dir = 1 - cur_dir;
  96.                 nxt.dist = cur_dist + 1;
  97.                 if(visitedx[nxt.x][nxt.dir] == 0 and visitedy[nxt.y][nxt.dir] == 0 and !(nxt.x == laser.first and nxt.y == laser.second)){
  98.                     q.push(nxt);
  99.                     // nxt.print();
  100.                 }
  101.             }
  102.         }
  103.         else{
  104.             for(auto nxty: coords[curx][cur_dir]){
  105.                 vertex nxt;
  106.                 nxt.x = curx;
  107.                 nxt.y = nxty;
  108.                 nxt.dir = 1 - cur_dir;
  109.                 nxt.dist = cur_dist + 1;
  110.                 if(visitedx[nxt.x][nxt.dir] == 0 and visitedy[nxt.y][nxt.dir] == 0 and !(nxt.x == laser.first and nxt.y == laser.second)){
  111.                     q.push(nxt);
  112.                     // nxt.print();
  113.                 }
  114.             }
  115.         }
  116.     }
  117.     if(ans == 2e9){
  118.         cout << "-1\n";
  119.     }
  120.     else{
  121.         cout << ans;
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement