许诺 • 12小时前
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
struct Point {
int x, y;
Point(int x_, int y_) : x(x_), y(y_) {}
};
int n, m; vector grid; vector<vector> visited; bool isValid(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < m && grid[x][y] == '#';
} void bfs(int startX, int startY) {
queue<Point> q;
q.push(Point(startX, startY));
visited[startX][startY] = true;
int dx[] = {0, 0, 1, -1, 1, -1, 1, -1, 2, -2, 0, 0, 1, -1, 1, -1, 2, -2, 0, 0, 1, -1, 1, -1, 2, -2};
int dy[] = {1, -1, 0, 0, 1, -1, -1, 1, 0, 0, 2, -2, 1, 1, -1, -1, 1, 1, -1, -1, 2, 2, -2, -2, 2, -2};
while (!q.empty()) {
Point p = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
int nx = p.x + dx[i];
int ny = p.y + dy[i];
if (isValid(nx, ny) && !visited[nx][ny]) {
int manhattan = abs(nx - p.x) + abs(ny - p.y);
if (manhattan <= 2) {
visited[nx][ny] = true;
q.push(Point(nx, ny));
}
}
}
}
}
int main() {
cin >> n >> m;
grid.resize(n);
visited.resize(n, vector<bool>(m, false));
for (int i = 0; i < n; i++) {
cin >> grid[i];
}
int count = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (grid[i][j] == '#' && !visited[i][j]) {
count++;
bfs(i, j);
}
}
}
cout << count << endl;
return 0;
}
评论:
请先登录,才能进行评论