算法: FloodFill变形 难度中等
问题描述
你有一张某海域 NxN 像素的照片,".“表示海洋、”#"表示陆地,如下所示: 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。 由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子: 请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
思路
代码如下
import os
import sys
"""
思路:DFS
①用 DFS搜出有多少个岛(连通块),检查这个岛有没有高地,
②统计那些没有高地的岛(连通块)的数量。
"""
def bfs(x,y):
global flag
q.append((x,y))
vis[x][y]=1
while len(q):
item=q.pop(0)
tx=item[0]
ty=item[1]
if a[tx][ty+1]=='#' and a[tx][ty-1]=='#' and a[tx+1][ty]=='#' and a[tx-1][ty]=='#':
flag=False
for i in range(4):
nx=tx+dir[i][0]
ny=ty+dir[i][1]
if vis[nx][ny]==0 and a[nx][ny]=='#':
vis[nx][ny]=1
q.append((nx,ny))
n=int(input())
a=[]
for i in range(n):
a.append(input())
vis=[[0]*n for i in range(n)]
dir=[(0,1),(0,-1),(1,0),(-1,0)]
q=[]
ans=0
for i in range(n):
for j in range(n):
if a[i][j]=='#' and vis[i][j]==0:
flag=True
bfs(i,j)
if flag:ans+=1
print(ans)
分析阶段: ①为什么要以len(q)为结束条件 #在这里,我们是使用了队列,将每一个陆地和周围的情况进行一个个排查,如果q空了,说明该点周围都不存在陆地
|