样例二:

输入

5

.....

.###.

.###.

.###.

.....

输出:

0

import sys
from collections import deque
# 算法步骤
# 1、输入   N 和地图 grid[N][N]。

# 2、找到所有区域(用BFS/DFS连通块划分)对原始地图中的所有 # 进行连通块划分,得到若干个区域(每个区域是一个集合)。
# 代码实现: for循环遍历每个点,由于bfs加持,进入循环一次说明有一个区域,count++

# 3、标记“一天后会留下的 #”:遍历所有 #,如果它的四个邻居(上、下、左、右)全部都不是 .(即都是 # 或越界),则标记它为“幸存”,否则它是“明天被淹”。
# 代码实现:借助bfs会访问上下左右的点的特性,我们插入flag2,意思为,只要有一个方向是'.' flag2变为False来表示该点抗洪失败,所以初始flag2得设置为True。
# 又因为一个区域中,只要有一个块儿四方都是“#”说明这里为幸存区域,引入flag1,因为flag1变为True才表示区域幸存,即一开始要设置为Flase


# 答案是要求会被淹没的区域,即“总区域(count)” - “幸存区域”

N = int(sys.stdin.readline())
grid = [input() for _ in range(N)]

q = deque()
visited = [[False] * N for _ in range(N)]
dirs = [(-1, 0), (1, 0), (0, -1), (0, 1)]
# 联通区域数量
count = 0
for i in range(N):
    for j in range(N):
        if grid[i][j] == '#' and not visited[i][j]:
            visited[i][j] = True
            q.append((i, j))
            count += 1
            F1 = False
            while q:
                x_now, y_now = q.popleft()
                F2 = True
                for dx, dy in dirs:
                    x_next, y_next = x_now + dx, y_now +dy
                    if 0 <= x_next < N and 0 <= y_next < N:
                        if not visited[x_next][y_next] and grid[x_next][y_next] == '#':
                            visited[x_next][y_next] = True
                            q.append((x_next, y_next))
                        if grid[x_next][y_next] == '.':
                            F2 = False
                if F2:
                    F1 = True

            if F1:
                count -= 1


print(count)