样例二:
输入
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)

京公网安备 11010502036488号