一、题目链接
二、题目分析
此题大致与常规bfs题目相同,对于特殊点进行广度搜索,此题不一样的点在于需要去计算已经消失的岛屿,就需要去借助标记来去判断,这一点在接下来的代码会详细讲解。
三、代码思路
- 按规定输入n与海域照片。
- 建立一个方向列表和访问列表,方向列表用于搜索时判断四个方向的点,访问列表用来标记该点是否已经访问过。
- 写bfs函数,此函数主要用于判断输入的点是否在若干年之后是否会被淹没,而且会判断连接着的点是否会被淹没,也就是一次判断一个岛屿是否会淹没。
- 依次走海域照片每个点,并且判断淹没的岛屿数。
四、关键点详解
- bfs函数单次搜索的是一个岛屿,因为不同岛屿之间不是互相连接的。
- 一开始我们假设岛屿是淹没的,设置一个标志位flag,当在岛屿中找到不会淹没的点时,我们就改变标志位的值,这个flag也是我们最终判断淹没岛屿数量的标准。
五、最终代码
n = int(input())
arr = []
for i in range(n):
arr.append(input()) #输入海洋列表
dire = [(1,0),(-1,0),(0,-1),(0,1)] #方向列表
vis = [[0 for i in range(n)] for j in range(n)] #访问列表
flag = True
q = []
def bfs(x,y):
global flag
q.append((x,y)) #将陆地入列表
vis[x][y] = 1 #用1表示为访问过
while len(q):
temp = q.pop(0)
tx,ty = temp[0],temp[1]
if arr[tx+1][ty] == '#' and arr[tx-1][ty] =='#' and arr[tx][ty-1] == '#' and arr[tx][ty+1] == '#':
flag = False #这个点不会被淹没
for x,y in dire:
nx = tx +x
ny = ty + y
if arr[nx][ny] == '#' and vis[nx][ny] == 0 :# 是陆地而且没有被访问过
vis[nx][ny] = 1 #标记为访问过
q.append((nx,ny)) #入列表
nums = 0 #被淹没的岛数量
for i in range(1,n):
for j in range(1,n):
if arr[i][j] == '#' and vis[i][j] == 0: # 是陆地且没有被访问过
flag = True #先假设已经淹没
bfs(i,j)
if flag :
nums += 1
print(nums)