AC

许诺  •  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;

}


评论:

请先登录,才能进行评论