Advertisement
Josif_tepe

Untitled

Dec 22nd, 2024
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5. const int maxn = 51;
  6. int n, m;
  7. char mat[maxn][maxn];
  8. int shortest_path[maxn][maxn][501];
  9. int dist_between_metro_stations[maxn][maxn][maxn][maxn];
  10. void bfs(vector<pair<int, int>> & ms) {
  11.     int di[] = {-1, 1, 0, 0};
  12.     int dj[] = {0, 0, -1, 1};
  13.     for(int i = 0; i < (int) ms.size(); i++) {
  14.         vector<vector<bool>> visited(n, vector<bool>(m, false));
  15.  
  16.         int si = ms[i].first;
  17.         int sj = ms[i].second;
  18.        
  19.         queue<int> q;
  20.         q.push(si);
  21.         q.push(sj);
  22.         q.push(0);
  23.        
  24.         while(!q.empty()) {
  25.             int ci = q.front();
  26.             q.pop();
  27.             int cj = q.front();
  28.             q.pop();
  29.             int dist = q.front();
  30.             q.pop();
  31.            
  32.             if(mat[ci][cj] == 'M') {
  33.                 dist_between_metro_stations[si][sj][ci][cj] = dist;
  34.             }
  35.             for(int k = 0; k < 4; k++) {
  36.                 int ti = ci + di[k];
  37.                 int tj = cj + dj[k];
  38.                
  39.                 if(ti >= 0 and ti < n and tj >= 0 and tj < m and !visited[ti][tj]) {
  40.                     q.push(ti);
  41.                     q.push(tj);
  42.                     q.push(dist + 1);
  43.                     visited[ti][tj] = true;
  44.                 }
  45.             }
  46.         }
  47.     }
  48.  
  49. }
  50.  
  51. struct node {
  52.     int ci, cj;
  53.     int time, money;
  54.    
  55.     node() {}
  56.     node(int _ci, int _cj, int _time, int _money) {
  57.         ci = _ci;
  58.         cj = _cj;
  59.         time = _time;
  60.         money = _money;
  61.     }
  62.    
  63.     bool operator < (const node & tmp) const {
  64.         if(money == tmp.money) {
  65.             return time > tmp.time;
  66.         }
  67.         return money > tmp.money;
  68.     }
  69. };
  70. int main() {
  71.     int metro_stations, time_limit;
  72.     cin >> n >> m >> metro_stations >> time_limit;
  73.    
  74.     vector<pair<int, int>> ms;
  75.    
  76.     int si, sj;
  77.     int ei, ej;
  78.     for(int i = 0; i < n; i++) {
  79.         for(int j = 0; j < m; j++) {
  80.             cin >> mat[i][j];
  81.        
  82.             if(mat[i][j] == 'T') {
  83.                 si = i;
  84.                 sj = j;
  85.             }
  86.             if(mat[i][j] == 'K') {
  87.                 ei = i;
  88.                 ej = j;
  89.             }
  90.             if(mat[i][j] == 'M') {
  91.                 ms.push_back(make_pair(i, j));
  92.             }
  93.            
  94.         }
  95.     }
  96.    
  97.     bfs(ms);
  98.    
  99.     for(int i = 0; i < n; i++) {
  100.         for(int j = 0; j < m; j++) {
  101.             for(int k = 0; k <= time_limit; k++) {
  102.                 shortest_path[i][j][k] = 2e9;
  103.             }
  104.         }
  105.     }
  106.     int di[] = {-1, 1, 0, 0};
  107.     int dj[] = {0, 0, -1, 1};
  108.     priority_queue<node> pq;
  109.     pq.push(node(si, sj, 0, 0));
  110.    
  111.     while(!pq.empty()) {
  112.         node c = pq.top();
  113.         pq.pop();
  114.        
  115.         if(c.ci == ei and c.cj == ej) {
  116.             cout << c.money << endl;
  117.             return 0;
  118.         }
  119.        
  120.         if(mat[c.ci][c.cj] == 'M') {
  121.             for(int i = 0; i < (int) ms.size(); i++) {
  122.                 int dist = dist_between_metro_stations[c.ci][c.cj][ms[i].first][ms[i].second];
  123.                 if(c.time + dist <= time_limit and c.money + 5 * dist < shortest_path[ms[i].first][ms[i].second][c.time + dist]) {
  124.                     pq.push(node(ms[i].first, ms[i].second, c.time + dist, c.money + 5 * dist));
  125.                     shortest_path[ms[i].first][ms[i].second][c.time + dist] = c.money + 5 * dist;
  126.                 }
  127.             }
  128.         }
  129.        
  130.         for(int k = 0; k < 4; k++) {
  131.             int ti = c.ci + di[k];
  132.             int tj = c.cj + dj[k];
  133.             if(ti >= 0 and ti < n and tj >= 0 and tj < m and mat[ti][tj] != '#') {
  134.                 if(c.time + 5 <= time_limit and c.money < shortest_path[ti][tj][c.time + 5]) {
  135.                     pq.push(node(ti, tj, c.time + 5, c.money));
  136.                     shortest_path[ti][tj][c.time + 5] = c.money;
  137.                 }
  138.                 if(c.time + 2 <= time_limit and c.money + 1 < shortest_path[ti][tj][c.time + 2]) {
  139.                     pq.push(node(ti, tj, c.time + 2, c.money + 1));
  140.                     shortest_path[ti][tj][c.time + 2] = c.money + 1;
  141.                 }
  142.             }
  143.         }
  144.     }
  145.     cout << -1 << endl;
  146.  
  147.     return 0;
  148.  
  149. }
  150.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement