Advertisement
Guest User

ACMP 979. Формула 001

a guest
Jul 21st, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.58 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <queue>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. const int N = 1000;
  10.  
  11. int n, x[N], y[N];
  12. std::map<std::pair<int, int>, int> vv;
  13. bool u[N][N];
  14. pair<int, int> p[N][N];
  15. int dx[9] = { -1, -1, -1,  0, 0, 0,  1, 1, 1 };
  16. int dy[9] = { -1,  0,  1, -1, 0, 1, -1, 0, 1 };
  17.  
  18. void aiok(std::queue<pair<int, int>>& q, int i, int v, int x, int y) {
  19.     if(vv.count({x, y})) {
  20.         int z = vv[{x, y}];
  21.         if(!u[v][z]) p[v][z] = {i, v}, u[v][z] = 1, q.push({v, z});
  22.     }
  23. }
  24.  
  25. int main() {
  26.     std::cin >> n;
  27.     for(int i = 0; i < n; ++i) std::cin >> x[i] >> y[i];
  28.     for(int i = 0; i < n; ++i) vv[{x[i], y[i]}] = i;
  29.     std::queue<pair<int, int>> q; q.push({0, 0}); u[0][0] = 1;
  30.     while(!q.empty()) {
  31.         auto v = q.front(); q.pop();
  32.         const int pv = v.first, cv = v.second;
  33.         const int mx = 2*x[cv]-x[pv], my = 2*y[cv]-y[pv];
  34.         //std::cout << pv << "; " << cv << endl;
  35.  
  36.         if(cv == n-1) {
  37.             vector<int> res;
  38.             for(int i=pv, j=cv; i+j != 0; ) {
  39.                 int a = i, b = j;
  40.                 res.push_back(j);
  41.                 i = p[a][b].first;
  42.                 j = p[a][b].second;
  43.             }
  44.  
  45.             reverse(res.begin(), res.end());
  46.             std::cout << res.size() << std::endl << "1 ";
  47.             for(int v : res) cout << v+1 << ' ';
  48.             return 0;
  49.         }
  50.  
  51.         for(int i = 0; i < 9; ++i)  {
  52.             const int ax=mx+dx[i], ay=my+dy[i];
  53.             aiok(q, pv, cv, ax, ay);
  54.         }
  55.     }
  56.    
  57.     std::cout << -1;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement