Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- vector<vector<char>> G; // G - это матрица, которая даётся на входе
- vector<vector<bool>> was; // was[i][j] = true, если мы уже посетили G[i][j], false - если нет
- vector<pair<int, int>> SDV = { // SDV - массив сдвигов. SDV[i].first = x, SDV[i].second = y - это означает, что чтобы из v-ой клетки (с координатами (p; q)) перейти в i-ую смежную нужно к p прибавить x, а к q прибавить j
- {-1, 0}, // смежная вершина сверху
- {0, 1}, // смежная вершина справа
- {1, 0}, // смежная вершина снизу
- {0, -1} // смежная вершина слева
- };
- bool in(int i, int j) { // функция in возвращает true, если клетка с координатами (i; j) находится внутри матрицы
- return i >= 0 && i < G.size() && j >= 0 && j < G[i].size();
- }
- void dfs(int i, int j) { // Поиск в глубину, аргументы которого - это координаты текущей клетки
- was[i][j] = true; // устанавливаем, что клетка с координатами (i; j) посещена
- for (pair<int, int> sdv : SDV) { // Проходимся по сдвигам
- int to_i = i + sdv.first; // 1-ая координата новой смежной клетки - это 1-ая координата текущей клетки + сдвиг для неё
- int to_j = j + sdv.second; // 2-ая координата новой смежной клетки - это 2-ая координата текущей клетки + сдвиг для неё
- if (in(to_i, to_j) && !was[to_i][to_j] && G[to_i][to_j] == '#') { // Если новая смежная клетка находится внутри матрицы, и мы ещё не были в ней, и она не вырезана, то запускаем из этой клетки DFS
- dfs(to_i, to_j); // запускаем DFS
- }
- }
- }
- void solve() {
- int n, m;
- cin >> n >> m;
- G.resize(n, vector<char>(m)); // матрица имеет размера n на m
- was.resize(n, vector<bool>(m)); // was должно иметь такой же размер, как и G
- for (int i = 0; i < n; ++i) { // Итерируемся по строкам
- for (int j = 0; j < m; ++j) { // Итерируемся по столбцам
- cin >> G[i][j]; // Считываем символ матрицы на пересечении i-ой строки и j-го столбца
- }
- }
- int cnt = 0; // cnt - это искомое кол-во компонент
- for (int i = 0; i < n; ++i) { // Итерируемся по строкам
- for (int j = 0; j < m; ++j) { // Итерируемся по столбцам
- if (!was[i][j] && G[i][j] == '#') { // Если мы ещё не были в клетке с координатами (i; j) и она не удалена, то запускаемся DFS-ом из неё
- cnt++; // Увеличиваем кол-во компонент
- dfs(i, j); // Запускаем DFS
- }
- }
- }
- cout << cnt; // выводим ответ
- }
- int main() {
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment