MinhNGUYEN2k4

Untitled

Dec 29th, 2020 (edited)
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.29 KB | None | 0 0
  1. //Nguyen Huu Hoang Minh
  2. //THTIME problem
  3. /*
  4. Sol: sử dụng thuật toán dijkstra, nếu đi qua các đỉnh kề bên trong cùng thời gian thì độ dài cạnh là 0, nếu đi qua đỉnh hiện tại ở thời gian khác thì độ dài cạnh là 1, kết quả là d[x][y][0] với x, y là tọa độ đỉnh kết thúc và 0 là trạng thái ở hiện tại
  5. */
  6. #include <bits/stdc++.h>
  7. #define sz(x) int(x.size())
  8. #define all(x) x.begin(),x.end()
  9. #define reset(x) memset(x, 0,sizeof(x))
  10. #define pb push_back
  11. #define mp make_pair
  12. #define fi first
  13. #define se second
  14. #define N 2005
  15. #define remain(x) if (x > MOD) x -= MOD
  16. #define ii pair<int, int>
  17. #define iiii pair< ii , ii >
  18. #define viiii vector< iiii >
  19. #define vi vector<int>
  20. #define vii vector< ii >
  21. #define bit(x, i) (((x) >> (i)) & 1)
  22. #define Task "test"
  23. #define int long long
  24.  
  25. using namespace std;
  26.  
  27. typedef long double ld;
  28. const int inf = 1e10;
  29.  
  30. int n,m;
  31. char pre[N][N], pas[N][N];
  32. int stx,sty,enx,eny;
  33. int d[N][N][2];
  34. int dx[4] = {0,0,1,-1};
  35. int dy[4] = {1,-1,0,0};
  36.  
  37. void readfile()
  38. {
  39.     ios_base::sync_with_stdio(false);
  40.     cin.tie(0);cout.tie(0);
  41.     if (fopen(Task".inp","r"))
  42.     {
  43.         freopen(Task".inp","r",stdin);
  44.         //freopen(Task".out","w",stdout);
  45.     }
  46.     cin >> n >> m;
  47.     for(int i=1; i<=n; i++)
  48.     {
  49.         for(int j=1; j<=m; j++){
  50.             cin >> pre[i][j];
  51.             if (pre[i][j] == 'S') stx = i, sty = j;
  52.             if (pre[i][j] == 'T') enx = i, eny = j;
  53.         }
  54.     }
  55.     for(int i=1; i<=n; i++)
  56.         for(int j=1; j<=m; j++) cin >> pas[i][j];
  57. }
  58.  
  59. void dijkstra()
  60. {
  61.     priority_queue<iiii, viiii, greater<iiii>> q;
  62.     for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) d[i][j][0] = d[i][j][1] = inf;
  63.     d[stx][sty][0] = 0;
  64.     q.push(iiii(ii(0,0),ii(stx,sty)));
  65.     while (q.size())
  66.     {
  67.         int u = q.top().se.fi;
  68.         int v = q.top().se.se;
  69.         int mask = q.top().fi.se;
  70.         int du = q.top().fi.fi;
  71.         q.pop();
  72.         if (d[u][v][mask] != du) continue;
  73.         bool travel = false;
  74.         if (mask==0) if (pas[u][v]=='.' || pas[u][v]=='T') travel=true;
  75.         if (mask==1) if (pre[u][v]=='.' || pre[u][v]=='T') travel=true;
  76.         for(int i=0; i<4; i++)
  77.         {
  78.             int x = u + dx[i];
  79.             int y = v + dy[i];
  80.             if (x < 1 || x > n || y < 1 || y > m) continue;
  81.             bool can_go=false;
  82.             if (mask==0) if (pre[x][y]=='.' || pre[x][y]=='T') can_go = true;
  83.             if (mask==1) if (pas[x][y]=='.' || pas[x][y]=='T') can_go = true;
  84.             if (d[x][y][mask] > d[u][v][mask] && can_go){
  85.                 d[x][y][mask] = d[u][v][mask];
  86.                 q.push(iiii(ii(d[x][y][mask],mask),ii(x,y)));
  87.             }
  88.             if (d[u][v][1-mask] > d[u][v][mask]+1 && travel)
  89.             {
  90.                 d[u][v][1-mask] = d[u][v][mask] + 1;
  91.                 q.push(iiii(ii(d[u][v][1-mask],1-mask),ii(u,v)));
  92.             }
  93.         }
  94.     }
  95. }
  96.  
  97. void proc()
  98. {
  99.     dijkstra();
  100.         /*
  101.     for(int i=1; i<=n; i++)
  102.         for(int j=1; j<=m; j++) cout << d[i][j][0] << " \n"[j==m];
  103.     for(int i=1; i<=n; i++)
  104.         for(int j=1; j<=m; j++) cout << d[i][j][1] << " \n"[j==m];
  105.         */
  106.     cout << d[enx][eny][0];
  107. }
  108.  
  109. signed main()
  110. {
  111.     readfile();
  112.     proc();
  113.     return 0;
  114. }
  115.  
Add Comment
Please, Sign In to add comment