Advertisement
ivangarvanliev

Untitled

Oct 8th, 2024
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.72 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4. using namespace std;
  5.  
  6. const int INF = INT_MAX;
  7.  
  8.  
  9.  
  10.  
  11. int main() {
  12.     ios_base::sync_with_stdio(false);
  13.     cin.tie(NULL);
  14.     int R, C;
  15.     char mat[100][100];
  16.     int dist[100][100];
  17.     int drink_dist[4][4];
  18.     int dx[] = {1, -1, 0, 0};
  19.     int dy[] = {0, 0, 1, -1};
  20.     vector<pair<int, int>> points;
  21.     cin >> R >> C;
  22.    
  23.     pair<int, int> start, beach;
  24.     vector<pair<int, int>> drinks;
  25.    
  26.    
  27.     for (int i = 0; i < R; i++) {
  28.         for (int j = 0; j < C; j++) {
  29.             cin >> mat[i][j];
  30.             if (mat[i][j] == 'S') {
  31.                 start = {i, j};
  32.             } else if (mat[i][j] == 'B') {
  33.                 beach = {i, j};
  34.             } else if (mat[i][j] == 'D') {
  35.                 drinks.push_back({i, j});
  36.             }
  37.         }
  38.     }
  39.  
  40.     points.push_back(start);
  41.     for (auto d : drinks) points.push_back(d);
  42.     points.push_back(beach);
  43.  
  44.     auto bfs = [&](int start_idx) {
  45.         queue<pair<int, int>> q;
  46.         int start_x = points[start_idx].first;
  47.         int start_y = points[start_idx].second;
  48.        
  49.         for (int i = 0; i < R; i++) {
  50.             for (int j = 0; j < C; j++) {
  51.                 dist[i][j] = INF;
  52.             }
  53.         }
  54.        
  55.         dist[start_x][start_y] = 0;
  56.         q.push({start_x, start_y});
  57.        
  58.         while (!q.empty()) {
  59.             int x = q.front().first;
  60.             int y = q.front().second;
  61.             q.pop();
  62.            
  63.             for (int dir = 0; dir < 4; dir++) {
  64.                 int nx = x + dx[dir];
  65.                 int ny = y + dy[dir];
  66.                
  67.                 if (nx >= 0 && nx < R && ny >= 0 && ny < C && mat[nx][ny] != '#' && dist[nx][ny] == INF) {
  68.                     dist[nx][ny] = dist[x][y] + 1;
  69.                     q.push({nx, ny});
  70.                 }
  71.             }
  72.         }
  73.        
  74.         for (int i = 0; i < points.size(); i++) {
  75.             drink_dist[start_idx][i] = dist[points[i].first][points[i].second];
  76.         }
  77.     };
  78.  
  79.     for (int i = 0; i < points.size(); i++) {
  80.         bfs(i);
  81.     }
  82.  
  83.     vector<int> order;
  84.     for (int i = 1; i <= drinks.size(); i++) {
  85.         order.push_back(i);
  86.     }
  87.  
  88.     int min_steps = INF;
  89.    
  90.     do {
  91.         int current_steps = drink_dist[0][order[0]];
  92.         for (int i = 1; i < order.size(); i++) {
  93.             current_steps += drink_dist[order[i-1]][order[i]];
  94.         }
  95.         current_steps += drink_dist[order.back()][points.size() - 1];
  96.         min_steps = min(min_steps, current_steps);
  97.     } while (next_permutation(order.begin(), order.end()));
  98.  
  99.     if (min_steps >= INF) {
  100.         cout << -1 << endl;
  101.     } else {
  102.         cout << min_steps << endl;
  103.     }
  104.  
  105.     return 0;
  106. }
  107.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement