Advertisement
coloriot

HA30_Subway(5)

Nov 8th, 2024
16
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7. class Manhattan {
  8. private:
  9.     int N, M;
  10.     vector<vector<int> > grid;
  11.     vector<vector<int> > distances;
  12.     vector<vector<bool> > visited;
  13.  
  14.     // Смещения для перемещения вверх, вниз, влево и вправо
  15.     int dx[4];
  16.     int dy[4];
  17.  
  18. public:
  19.     Manhattan(int n, int m, const vector<vector<int> >& input_grid) {
  20.         N = n;
  21.         M = m;
  22.         grid = input_grid;
  23.         distances.resize(N, vector<int>(M, -1));
  24.         visited.resize(N, vector<bool>(M, false));
  25.  
  26.         // Инициализация смещений
  27.         dx[0] = -1; dy[0] = 0;  // Вверх
  28.         dx[1] = 1;  dy[1] = 0;  // Вниз
  29.         dx[2] = 0;  dy[2] = -1; // Влево
  30.         dx[3] = 0;  dy[3] = 1;  // Вправо
  31.     }
  32.  
  33.     bool is_valid(int x, int y) {
  34.         return x >= 0 && x < N && y >= 0 && y < M;
  35.     }
  36.  
  37.     void BFS() {
  38.         queue<pair<int, int> > q;
  39.  
  40.         // Инициализируем очередь ресторанами и устанавливаем расстояния до них равными 0
  41.         for (int i = 0; i < N; ++i) {
  42.             for (int j = 0; j < M; ++j) {
  43.                 if (grid[i][j] == 1) {
  44.                     q.push(make_pair(i, j));
  45.                     distances[i][j] = 0;
  46.                     visited[i][j] = true;
  47.                 }
  48.             }
  49.         }
  50.  
  51.         // Выполняем BFS
  52.         while (!q.empty()) {
  53.             pair<int, int> current = q.front();
  54.             q.pop();
  55.             int x = current.first;
  56.             int y = current.second;
  57.  
  58.             for (int dir = 0; dir < 4; ++dir) {
  59.                 int nx = x + dx[dir];
  60.                 int ny = y + dy[dir];
  61.  
  62.                 if (is_valid(nx, ny) && !visited[nx][ny]) {
  63.                     distances[nx][ny] = distances[x][y] + 1;
  64.                     visited[nx][ny] = true;
  65.                     q.push(make_pair(nx, ny));
  66.                 }
  67.             }
  68.         }
  69.     }
  70.  
  71.     void print_distances() {
  72.         for (int i = 0; i < N; ++i) {
  73.             for (int j = 0; j < M; ++j) {
  74.                 cout << distances[i][j];
  75.                 if (j < M - 1) {
  76.                     cout << " ";
  77.                 }
  78.             }
  79.             cout << endl;
  80.         }
  81.     }
  82. };
  83.  
  84. int main() {
  85.     int N, M;
  86.     cin >> N >> M;
  87.  
  88.     vector<vector<int> > grid(N, vector<int>(M));
  89.  
  90.     for (int i = 0; i < N; ++i) {
  91.         for (int j = 0; j < M; ++j) {
  92.             cin >> grid[i][j];
  93.         }
  94.     }
  95.  
  96.     Manhattan manhattan(N, M, grid);
  97.     manhattan.BFS();
  98.     manhattan.print_distances();
  99.  
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement