Bobert0032

Пособие/«Удаление клеток»

Jul 19th, 2023 (edited)
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. vector<vector<char>> G; // G - это матрица, которая даётся на входе
  7. vector<vector<bool>> was; // was[i][j] = true, если мы уже посетили G[i][j], false - если нет
  8.  
  9. vector<pair<int, int>> SDV = { // SDV - массив сдвигов. SDV[i].first = x, SDV[i].second = y - это означает, что чтобы из v-ой клетки (с координатами (p; q)) перейти в i-ую смежную нужно к p прибавить x, а к q прибавить j
  10.         {-1, 0}, // смежная вершина сверху
  11.         {0, 1}, // смежная вершина справа
  12.         {1, 0}, // смежная вершина снизу
  13.         {0, -1} // смежная вершина слева
  14. };
  15.  
  16. bool in(int i, int j) { // функция in возвращает true, если клетка с координатами (i; j) находится внутри матрицы
  17.     return i >= 0 && i < G.size() && j >= 0 && j < G[i].size();
  18. }
  19.  
  20. void dfs(int i, int j) { // Поиск в глубину, аргументы которого - это координаты текущей клетки
  21.     was[i][j] = true; // устанавливаем, что клетка с координатами (i; j) посещена
  22.     for (pair<int, int> sdv : SDV) { // Проходимся по сдвигам
  23.         int to_i = i + sdv.first; // 1-ая координата новой смежной клетки - это 1-ая координата текущей клетки + сдвиг для неё
  24.         int to_j = j + sdv.second; // 2-ая координата новой смежной клетки - это 2-ая координата текущей клетки + сдвиг для неё
  25.         if (in(to_i, to_j) && !was[to_i][to_j] && G[to_i][to_j] == '#') { // Если новая смежная клетка находится внутри матрицы, и мы ещё не были в ней, и она не вырезана, то запускаем из этой клетки DFS
  26.             dfs(to_i, to_j); // запускаем DFS
  27.         }
  28.     }
  29. }
  30.  
  31. void solve() {
  32.     int n, m;
  33.     cin >> n >> m;
  34.     G.resize(n, vector<char>(m)); // матрица имеет размера n на m
  35.     was.resize(n, vector<bool>(m)); // was должно иметь такой же размер, как и G
  36.     for (int i = 0; i < n; ++i) { // Итерируемся по строкам
  37.         for (int j = 0; j < m; ++j) { // Итерируемся по столбцам
  38.             cin >> G[i][j]; // Считываем символ матрицы на пересечении i-ой строки и j-го столбца
  39.         }
  40.     }
  41.     int cnt = 0; // cnt - это искомое кол-во компонент
  42.     for (int i = 0; i < n; ++i) { // Итерируемся по строкам
  43.         for (int j = 0; j < m; ++j) { // Итерируемся по столбцам
  44.             if (!was[i][j] && G[i][j] == '#') { // Если мы ещё не были в клетке с координатами (i; j) и она не удалена, то запускаемся DFS-ом из неё
  45.                 cnt++; // Увеличиваем кол-во компонент
  46.                 dfs(i, j); // Запускаем DFS
  47.             }
  48.         }
  49.     }
  50.     cout << cnt; // выводим ответ
  51. }
  52.  
  53. int main() {
  54.     solve();
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment