定义静态全局变量:
visited数组标记当前点是否被访问;
map表示地图;
dx,dy分别表示x,y进行上下左右偏移时的偏移量。

用BFS思想解题:
地图上每个未访问过的表示陆地的点【表示一个岛屿】进行bfs,记录沉没的岛屿数;
在bfs中,每访问一个表示陆地的点就将其标记未已经访问,对该点上下左右四个方向查找陆地,将该岛屿整块进行标记,避免后续遍历时重复访问岛屿,在四个方向上查找陆地过程中记录当前点是否四个方向都是陆地,如果是,说明该岛屿不会完全沉没,返回0,如果遍历完整个岛屿都不存在这样的点,说明当前岛屿会完全沉没,返回1【完全沉没岛屿数+1】。

  1. import java.util.ArrayDeque;
  2. import java.util.Queue;
  3. import java.util.Scanner;
  4. public class Main {
  5. static boolean[][] visited = new boolean[1010][1010];
  6. static int[] dx = {-1,1,0,0};
  7. static int[] dy = {0,0,-1,1};
  8. static char[][] map = new char[1010][1010];
  9. public static void main(String[] args) {
  10. Scanner sc = new Scanner(System.in);
  11. int n = sc.nextInt();
  12. sc.nextLine();
  13. String temp;
  14. for(int i=0;i<n;i++) {
  15. temp = sc.nextLine();
  16. map[i] = temp.toCharArray();
  17. }
  18. int res = 0; // 记录结果【沉没岛屿数】
  19. for(int i=0;i<n;i++) {
  20. for(int j=0;j<n;j++) {
  21. if(map[i][j]=='#'&&!visited[i][j]) { // 当前点为陆地且未被访问
  22. visited[i][j] = true; // 将其标记为已访问
  23. res+=dfs(i,j); //记录结果
  24. }
  25. }
  26. }
  27. System.out.println(res);
  28. }
  29. // x,y表示当前要访问点的下标
  30. public static int dfs(int x,int y) {
  31. Queue<int[]> queue = new ArrayDeque<>(); // 用来装当前岛屿的点,进行逐个访问
  32. int flag = 1; //标记该岛屿是否会被完全淹没【是否存在四周都是陆地的陆地】,默认会被完全淹没
  33. // wx,wy保存队列中弹出点的坐标;
  34. //tx,ty保存该点在四个方向偏移的坐标;
  35. //k用来记录该点四面中是陆地的数量
  36. int k = 0,tx ,ty ,wx,wy;
  37. int[] temp = null; // 保存队列中的弹出结点
  38. queue.offer(new int[]{x,y}); // 先将当前要访问的结点入队
  39. // 遍历访问包含该点的整个岛屿【避免后续重复遍历】
  40. while(!queue.isEmpty()) {
  41. temp = queue.poll();
  42. wx = temp[0];wy = temp[1];
  43. k = 0;
  44. // 看上下左右是否存在陆地
  45. for(int i=0;i<4;i++) {
  46. tx =wx+dx[i];
  47. ty =wy+dy[i];
  48. if(map[tx][ty]=='#') {
  49. k++;
  50. if(!visited[tx][ty]) { // 如果该点未访问
  51. visited[tx][ty] = true;
  52. queue.offer(new int[] {tx,ty}); // 入队
  53. }
  54. }
  55. }
  56. if(k==4) flag = 0; //说明至少存在四面都是陆地的点,该岛屿不会被完全淹没
  57. }
  58. return flag;
  59. }
  60. }
点赞(0)
 

9.9 分

1 人评分

 

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论