# BFS-全球变暖
from collections import deque
n = int(input())
M = [[i for i in input()] for j in range(n)]
vis = [[0] * n for i in range(n)] # 标记列表
flag = True # 淹没标志
def bfs(x, y):
flag=True
q = deque([(x, y)]) # 初始化开始遍历的坐标
while q:
x, y = q.popleft()
if M[x][y + 1] == '#' and M[x][y - 1] == '#' and M[x + 1][y] == '#' and M[x - 1][y] == '#':
flag = False # 如果格子的四个方向有岛屿,中间的高地不会被淹没
for i, j in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
a, b = x + i, y + j
if vis[a][b] == 0 and M[a][b] == '#':
vis[a][b] = 1 # 标记岛屿遍历过了
q.append((a, b)) # 遍历下一个岛屿
return flag
ans = 0
for i in range(n): # 遍历每一个格子
for j in range(n):
if vis[i][j] == 0 and M[i][j] == '#':
flag = True # 设置淹没标志
if bfs(i, j): # 搜索这个格子,判断是否需要更改淹没标志
ans += 1
print(ans)
'''
样例输入:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
样例输出:
1
'''
定义全局变量型
#BFS-全球变暖
from collections import deque
n=int(input())
M=[[i for i in input()]for j in range(n)]
vis=[[0]*n for i in range(n)] #标记列表
flag=True #淹没标志
def bfs(x,y):
global flag
q=deque([(x,y)]) #初始化开始遍历的坐标
while q:
x,y=q.popleft()
if M[x][y+1]=='#' and M[x][y-1]=='#' and M[x+1][y]=='#' and M[x-1][y]=='#':
flag=False #如果格子的四个方向有岛屿,中间的高地不会被淹没
for i,j in [(0,1),(0,-1),(1,0),(-1,0)]:
a,b=x+i,y+j
if vis[a][b]==0 and M[a][b]=='#':
vis[a][b]=1 #标记岛屿遍历过了
q.append((a,b)) #遍历下一个岛屿
ans=0
for i in range(n): #遍历每一个格子
for j in range(n):
if vis[i][j]==0 and M[i][j]=='#':
flag=True #设置淹没标志
bfs(i,j) #搜索这个格子,判断是否需要更改淹没标志
if flag==True: #如果淹没标志不变
ans+=1 #被淹岛屿数量加1
print(ans)
'''
样例输入:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
样例输出:
1
'''
涂色解法,只有44分拉了
注意列表的复制,不能使其同时指向的地址相同。
应该用标记列表的,这种对原迷宫列表进行修改来防止重复访问的手法太sb了,,,之前的涂色章节只有用于单独求解数量时好用。
from collections import deque
n=int(input())
mg=[]
mg1=[]
for i in range(n):
list1=list(input())
mg.append(list1)
mg1.append(list1.copy())#只能这样复制
# mg1=mg.copy(), 地址指针一样不行
vis=[[0]*n for i in range(n)]
def bfs1(sx,sy,l):#计算岛屿数量
q=deque([(sx,sy)])
while q:
nows=q.popleft()
x,y=nows[0],nows[1]
for dx, dy in [(0, 1), (1, 0), (0, -1), (-1, 0)]:
nx = dx + x
ny = dy + y
if 0 <= nx < n and 0 <= ny < n and l[nx][ny] == '#':
l[nx][ny] = '.'
q.append((nx,ny))
def bfs(nows,l):#进行岛屿覆盖
x,y=nows[0],nows[1]
for dx,dy in [(0,1),(1,0),(0,-1),(-1,0)]:
nx=dx+x
ny=dy+y
if 0<=nx<n and 0<=ny<n and vis[nx][ny]!=1 and l[nx][ny]=='.':
l[x][y]='.'
vis[x][y]=1
return
res1=0
for i in range(n):
for j in range(n):
if mg1[i][j]=='#':
mg1[i][j]='.'
bfs1(i,j,mg1)
res1+=1
for i in range(n):
for j in range(n):
if mg[i][j]=='#':
bfs([i,j],mg)
# for i in range(n):
# print(mg[i])
res2=0
for i in range(n):
for j in range(n):
if mg[i][j]=='#':
mg[i][j] = '.'
bfs1(i,j,mg)
res2+=1
print(res1-res2)