https://yukicoder.me/problems/no/697
前提知識
- BFS
解説
https://yukicoder.me/submissions/264253
連結成分をまとめて1グループとして数え上げていく。
このようにマス目での連結成分をまとめて行く作業はBFSでやるのが定石。
具体的には、左上から順にマスを見ていき、水があれば、そこからBFSをして連結している水を1つのグループとして検知していく。
この際に、二重にカウントしないように、水を抜いておこう。
int H, W, A[3010][3010]; int dx[4] = { 0, 1, 0, -1 }, dy[4] = { -1, 0, 1, 0 }; //--------------------------------------------------------------------------------------------------- void _main() { cin >> H >> W; rep(y, 0, H) rep(x, 0, W) cin >> A[y][x]; int ans = 0; rep(sy, 0, H) rep(sx, 0, W) if (A[sy][sx] == 1) { ans++; queue<pair<int, int>> que; que.push({ sx, sy }); A[sy][sx] = 0; while (!que.empty()) { int x = que.front().first; int y = que.front().second; que.pop(); rep(i, 0, 4) { int xx = x + dx[i]; int yy = y + dy[i]; if (0 <= xx and xx < W and 0 <= yy and yy < H) if (A[yy][xx] == 1) { que.push({ xx, yy }); A[yy][xx] = 0; } } } } cout << ans << endl; }