蓝桥杯全球变暖Python详细题解

246 阅读2分钟

一、题目链接

全球变暖 - 蓝桥云课 (lanqiao.cn)

二、题目分析

此题大致与常规bfs题目相同,对于特殊点进行广度搜索,此题不一样的点在于需要去计算已经消失的岛屿,就需要去借助标记来去判断,这一点在接下来的代码会详细讲解。

三、代码思路

  1. 按规定输入n与海域照片。
  2. 建立一个方向列表和访问列表,方向列表用于搜索时判断四个方向的点,访问列表用来标记该点是否已经访问过。
  3. 写bfs函数,此函数主要用于判断输入的点是否在若干年之后是否会被淹没,而且会判断连接着的点是否会被淹没,也就是一次判断一个岛屿是否会淹没。
  4. 依次走海域照片每个点,并且判断淹没的岛屿数。

四、关键点详解

  1. bfs函数单次搜索的是一个岛屿,因为不同岛屿之间不是互相连接的。
  2. 一开始我们假设岛屿是淹没的,设置一个标志位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)

六、通过记录

全球变暖.png