Advertisement
MaxObznyi

Problem C

May 14th, 2022
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.52 KB | None | 0 0
  1. #include <iostream>
  2. #include <queue>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 1001;
  8. const int INF = 1e9 + 1;
  9.  
  10. int n, m;
  11. char a[N][N];
  12. int dist[N][N][4];
  13.  
  14. struct cell {
  15. int dist, x, y, d;
  16. };
  17.  
  18. const int dx[4] = {-1, 0, 1, 0};
  19. const int dy[4] = {0, 1, 0, -1};
  20.  
  21. int next_dir(int d) {
  22. return (d + 1) % 4;
  23. }
  24.  
  25. int prev_dir(int d) {
  26. return (d + 3) % 4;
  27. }
  28.  
  29. struct CellComparator {
  30. bool operator() (cell a, cell b) {
  31. if (a.dist != b.dist)
  32. return a.dist > b.dist;
  33. return a.x < b.x;
  34. }
  35. };
  36.  
  37. int main()
  38. {
  39. cin >> n >> m;
  40. int rx, ry, tx, ty;
  41. for (int i = 0; i < n; i++)
  42. for (int j = 0; j < m; j++) {
  43. cin >> a[i][j];
  44. if (a[i][j] == 'R') {
  45. rx = i;
  46. ry = j;
  47. }
  48. if (a[i][j] == 'T') {
  49. tx = i;
  50. ty = j;
  51. }
  52.  
  53. for (int d = 0; d < 4; d++)
  54. dist[i][j][d] = INF;
  55. }
  56. priority_queue<cell, vector<cell>, CellComparator> q;
  57. for (int d = 0; d < 4; d++) {
  58. dist[rx][ry][d] = 0;
  59. q.push({0, rx, ry, d});
  60. }
  61. //cout << rx << ' ' << ry << endl;
  62. while (!q.empty()) {
  63. auto [distPos, x, y, d] = q.top();
  64. q.pop();
  65. if (distPos != dist[x][y][d])
  66. continue;
  67.  
  68. //cout << x << ' ' << y << ' ' << d << ' ' << distPos << endl;
  69. ///option 1
  70. if (dist[x][y][next_dir(d)] > dist[x][y][d] + 1) {
  71. dist[x][y][next_dir(d)] = dist[x][y][d] + 1;
  72. q.push({dist[x][y][next_dir(d)], x, y, next_dir(d)});
  73. }
  74. if (dist[x][y][prev_dir(d)] > dist[x][y][d] + 1) {
  75. dist[x][y][prev_dir(d)] = dist[x][y][d] + 1;
  76. q.push({dist[x][y][prev_dir(d)], x, y, prev_dir(d)});
  77. }
  78.  
  79. ///option 2
  80. int ax = x + dx[d], ay = y + dy[d];
  81. if (ax >= 0 && ax < n && ay >= 0 && ay < m && (a[ax][ay] == '.' || a[ax][ay] == 'T')
  82. && dist[ax][ay][d] > dist[x][y][d] + 2) {
  83. dist[ax][ay][d] = dist[x][y][d] + 2;
  84. q.push({dist[ax][ay][d], ax, ay, d});
  85. }
  86.  
  87. ///option 3
  88. if (ax >= 0 && ax < n && ay >= 0 && ay < m && a[ax][ay] == '#'
  89. && dist[ax][ay][d] > dist[x][y][d] + 11) {
  90. dist[ax][ay][d] = dist[x][y][d] + 11;
  91. q.push({dist[ax][ay][d], ax, ay, d});
  92. }
  93. }
  94.  
  95. cout << min({dist[tx][ty][0], dist[tx][ty][1], dist[tx][ty][2], dist[tx][ty][3]});
  96.  
  97. return 0;
  98. }
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement