Advertisement
Josif_tepe

Untitled

Nov 18th, 2024
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.95 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. using namespace std;
  5.  
  6. int n, m;
  7. char mat[105][105];
  8.  
  9. int bfs(pair<int, int> S, pair<int, int> E) {
  10.     vector<vector<bool>> visited(n, vector<bool>(m, false));
  11.     int si = S.first, sj = S.second;
  12.     int ei = E.first, ej = E.second;
  13.    
  14.     visited[si][sj] = true;
  15.     queue<int> q;
  16.     q.push(si);
  17.     q.push(sj);
  18.     q.push(0);
  19.    
  20.     while(!q.empty()) {
  21.         int ci = q.front();
  22.         q.pop();
  23.         int cj = q.front();
  24.         q.pop();
  25.         int dist = q.front();
  26.         q.pop();
  27.        
  28.         if(ci == ei and cj == ej) {
  29.             return dist;
  30.         }
  31.         if(ci + 1 < n and mat[ci + 1][cj] != '#' and !visited[ci + 1][cj]) {
  32.             q.push(ci + 1);
  33.             q.push(cj);
  34.             q.push(dist + 1);
  35.             visited[ci + 1][cj] = true;
  36.         }
  37.         if(ci - 1 >= 0 and mat[ci - 1][cj] != '#' and !visited[ci - 1][cj]) {
  38.             q.push(ci - 1);
  39.             q.push(cj);
  40.             q.push(dist + 1);
  41.             visited[ci - 1][cj] = true;
  42.         }
  43.         if(cj + 1 < m and mat[ci][cj + 1] != '#' and !visited[ci][cj + 1]) {
  44.             q.push(ci);
  45.             q.push(cj + 1);
  46.             q.push(dist + 1);
  47.             visited[ci][cj + 1] = true;
  48.         }
  49.         if(cj - 1 >= 0 and mat[ci][cj - 1] != '#' and !visited[ci][cj - 1]) {
  50.             q.push(ci);
  51.             q.push(cj - 1);
  52.             q.push(dist + 1);
  53.             visited[ci][cj - 1] = true;
  54.         }
  55.     }
  56.    
  57.    
  58.     return 1000;
  59. }
  60. int main()
  61. {
  62.     cin >> n >> m;
  63.    
  64.     pair<int, int> S, E;
  65.     vector<pair<int, int>> D;
  66.     for(int i = 0; i < n; i++) {
  67.         for(int j = 0; j < m; j++) {
  68.             cin >> mat[i][j];
  69.            
  70.             if(mat[i][j] == 'S') {
  71.                 S = make_pair(i, j);
  72.             }
  73.             if(mat[i][j] == 'B') {
  74.                 E = make_pair(i, j);
  75.             }
  76.             if(mat[i][j] == 'D') {
  77.                 D.push_back(make_pair(i, j));
  78.             }
  79.         }
  80.     }
  81.     int res = 1000;
  82.     if(D.size() == 1) {
  83.         res = bfs(S, D[0]) + bfs(D[0], E);
  84.     }
  85.     else if(D.size() == 2) {
  86.         res = min(res, bfs(S, D[0]) + bfs(D[0], D[1]) + bfs(D[1], E));
  87.         res = min(res, bfs(S, D[1]) + bfs(D[1], D[0]) + bfs(D[0], E));
  88.     }
  89.     else {
  90.         res = min(res, bfs(S, D[0]) + bfs(D[0], D[1]) + bfs(D[1], D[2]) + bfs(D[2], E));
  91.         res = min(res, bfs(S, D[0]) + bfs(D[0], D[2]) + bfs(D[2], D[1]) + bfs(D[1], E));
  92.         res = min(res, bfs(S, D[1]) + bfs(D[1], D[0]) + bfs(D[0], D[2]) + bfs(D[2], E));
  93.         res = min(res, bfs(S, D[1]) + bfs(D[1], D[2]) + bfs(D[2], D[0]) + bfs(D[0], E));
  94.         res = min(res, bfs(S, D[2]) + bfs(D[2], D[0]) + bfs(D[0], D[1]) + bfs(D[1], E));
  95.         res = min(res, bfs(S, D[2]) + bfs(D[2], D[1]) + bfs(D[1], D[0]) + bfs(D[0], E));
  96.        
  97.     }
  98.     if(res >= 1000) {
  99.         res = -1;
  100.     }
  101.     cout << res << endl;
  102.    
  103.         return 0;
  104. }
  105.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement