思路很清晰。

  1. 遍历图中所有的点,遇到 “#”, 代表是岛屿的区块。
  2. 用 bfs 向外扩展岛屿,遇到海就停住。 (使用一个 vis 记录遍历过的点)
  3. 在遍历一个岛屿的过程中,同时记录不会被淹没区块的数量:实现一个 flood 函数判断区块的上下左右是否是海洋。
  4. bfs 返回剩余区块的数量。 返回若为零代表完全被淹没。

几个注意的点:

  1. 题目问的是被完全淹没的点的数量。我看成了剩余的岛屿的数量,结果因为给的样例两种情况都是一就弄错了。
  2. 注意需要单独判断一下起始点是否会被淹没来决定区块数量的初始化值。(也可以不标记在后续的点中被搜索到。)
  1. import sys
  2. from collections import deque
  3. input = sys.stdin.readline
  4. n = int(input())
  5. sea = [list(input().strip()) for _ in range(n)]
  6. direct = [(0, 1), (1, 0), (-1, 0), (0, -1)]
  7. vis = [[False]*n for _ in range(n)]
  8. def check(x, y):
  9. if (x<0 or y<0 or x>=n or y>=n): return False
  10. if (vis[x][y]): return False
  11. if (sea[x][y]=="."): return False
  12. return True
  13. def flood(x, y):
  14. for dx, dy in direct:
  15. nx, ny = x + dx, y + dy
  16. if (nx<0 or ny<0 or nx>=n or ny>=n): continue
  17. if(sea[nx][ny]=="."): return True
  18. return False
  19. def bfs(x ,y):
  20. q = deque()
  21. q.append((x, y))
  22. blocks = 0 if flood(x, y) else 1
  23. while q:
  24. tx, ty = q.popleft()
  25. for dx, dy in direct:
  26. nx, ny = tx + dx, ty + dy
  27. if(check(nx, ny)):
  28. vis[nx][ny] = True
  29. q.append((nx, ny))
  30. if(not flood(nx, ny)): blocks+=1
  31. return blocks
  32. res = 0
  33. for x in range(n):
  34. for y in range(n):
  35. if(sea[x][y]=="#" and not vis[x][y]):
  36. vis[x][y] = True
  37. rest = bfs(x, y)
  38. if(rest==0): res+=1
  39. print(res)
点赞(0)
 

6 分

1 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论