Advertisement
mickypinata

CUBE-T038: Icy Floor

Apr 5th, 2020
280
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <tuple>
  5. using namespace std;
  6.  
  7. #define lli long long
  8. #define pii pair<int, int>
  9. #define tiii tuple<int, int, int>
  10. #define f first
  11. #define s second
  12.  
  13. tiii slip[1010][1010][4];
  14. bool board[1010][1010];
  15. int n;
  16.  
  17. void PrintSlip(){
  18.     for(int d = 0; d < 4; ++d){
  19.         cout << "Direction " << d << ":\n";
  20.         for(int i = 1; i <= n; ++i){
  21.             for(int j = 1; j <= n; ++j){
  22.                 printf("(R %d, C %d, W %d) ", get<0>(slip[i][j][d]), get<1>(slip[i][j][d]), get<2>(slip[i][j][d]));
  23.             }
  24.             cout << "\n";
  25.         }
  26.         cout << "\n";
  27.     }
  28. }
  29.  
  30. int Dijkstra(pii s, pii e){
  31.     vector<vector<int>> dist(n + 1, vector<int>(n + 1, 2e9));
  32.     vector<vector<bool>> visited(n + 1, vector<bool>(n + 1, false));
  33.     priority_queue<tiii, vector<tiii>, greater<tiii>> q; /// (dist, row, col)
  34.     dist[s.f][s.s] = 0;
  35.     q.push(make_tuple(dist[s.f][s.s], s.f, s.s));
  36.     while(!q.empty()){
  37.         int ur = get<1>(q.top());
  38.         int uc = get<2>(q.top());
  39.         q.pop();
  40.         if(ur == e.f && uc == e.s){
  41.             return dist[ur][uc];
  42.         }
  43.         if(visited[ur][uc]){
  44.             continue;
  45.         }
  46.         visited[ur][uc] = true;
  47.         for(int i = 0; i < 4; ++i){
  48.             int vr = get<0>(slip[ur][uc][i]);
  49.             int vc = get<1>(slip[ur][uc][i]);
  50.             int w = get<2>(slip[ur][uc][i]);
  51.             if(!visited[vr][vc] && dist[ur][uc] + w < dist[vr][vc]){
  52.                 dist[vr][vc] = dist[ur][uc] + w;
  53.                 q.push(make_tuple(dist[vr][vc], vr, vc));
  54.             }
  55.         }
  56.     }
  57.     return -1;
  58. }
  59.  
  60. int main(){
  61.  
  62.     int x;
  63.  
  64.     scanf("%d", &n);
  65.  
  66.     for(int i = 1; i <= n; ++i){
  67.         for(int j = 1; j <= n; ++j){
  68.             scanf("%d", &x);
  69.             if(x == 1){
  70.                 board[i][j] = true;
  71.             }
  72.         }
  73.     }
  74.  
  75.     /// Generate Map
  76.     for(int i = 1; i <= n; ++i){
  77.         pii stonel = {i, 1};
  78.         pii stoneu = {1, i};
  79.         for(int j = 1; j <= n; ++j){
  80.             if(board[i][j]){
  81.                 stonel = {i, j + 1};
  82.             } else {
  83.                 slip[i][j][3] = make_tuple(stonel.f, stonel.s, j - stonel.s);
  84.             }
  85.             if(board[j][i]){
  86.                 stoneu = {j + 1, i};
  87.             } else {
  88.                 slip[j][i][0] = make_tuple(stoneu.f, stoneu.s, j - stoneu.f);
  89.             }
  90.         }
  91.         pii stoner = {i, n};
  92.         pii stoned = {n, i};
  93.         for(int j = n; j >= 1; --j){
  94.             if(board[i][j]){
  95.                 stoner = {i, j - 1};
  96.             } else {
  97.                 slip[i][j][1] = make_tuple(stoner.f, stoner.s, stoner.s - j);
  98.             }
  99.             if(board[j][i]){
  100.                 stoned = {j - 1, i};
  101.             } else {
  102.                 slip[j][i][2] = make_tuple(stoned.f, stoned.s, stoned.f - j);
  103.             }
  104.         }
  105.     }
  106.     cout << Dijkstra({1, 1}, {n, n});
  107.  
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement