当前位置:   article > 正文

【leetcode.200】岛屿数量_给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛

一、题目描述

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:

输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。


二、思路

从网格的左上角开始,采用深度优先遍历,将与这个点连通的陆地全部遍历一遍。为了避免重复遍历,需要将遍历过的陆地进行标记。

陆地为1,水为0,遍历过的陆地为2。

假设(m,n)为网格上的任意一点,那么它的四周坐标为:

 

那么,当前思路是:

顺序遍历二维数组中的元素

        比如现在选择第一个位置,即(0,0)。如果当前位置为1,则岛屿数量自增1。

        接着开始访问旁边所有的点:

               沿着该点一直往上找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。

               沿着该点一直往下找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。

               沿着该点一直往左找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。

               沿着该点一直往右找,如果找到1,则将那块区域标记为2。如果不为1,则立即返回。


三、代码实现

  1. public class Number200 implements DFS {
  2. // (m-1,n)
  3. // (m,n-1) (m, n ) (m,n+1)
  4. // (m+1,n)
  5. char[][] map;
  6. public int numIslands(char[][] grid) {
  7. map = grid;
  8. int sum = 0;
  9. for (int i = 0; i < map.length; i++) {
  10. for (int j = 0; j < map[0].length; j++) {
  11. if (map[i][j] == '1') {
  12. sum++;
  13. dfs(i, j);
  14. }
  15. }
  16. }
  17. return sum;
  18. }
  19. private void dfs(int m, int n) {
  20. //如果不在区域中
  21. if (!inArea(m, n)) {
  22. return;
  23. }
  24. //如果是水
  25. if (map[m][n] == '0') {
  26. return;
  27. }
  28. //如果已经遍历过
  29. if (map[m][n] == '2') {
  30. return;
  31. }
  32. //当前位置为陆地,那么设置为访问过
  33. map[m][n] = '2';
  34. //一直向上访问
  35. dfs(m - 1, n);
  36. //一直向下访问
  37. dfs(m + 1, n);
  38. //一直向左访问
  39. dfs(m, n - 1);
  40. //一直向右访问
  41. dfs(m, n + 1);
  42. }
  43. //判断是否在网格中
  44. private boolean inArea(int m, int n) {
  45. return m >= 0 && m < map.length
  46. && n >= 0 && n < map[0].length;
  47. }
  48. public static void main(String[] args) {
  49. char[][] map = {{'1', '1', '1', '1', '0'}, {'1', '1', '0', '1', '0'}, {'1', '1', '0', '0', '0'}, {'0', '0', '0', '0', '0'}};
  50. int i = new Number200().numIslands(map);
  51. System.out.println(i);
  52. }
  53. }

提交答案:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/1006491
推荐阅读
相关标签
  

闽ICP备14008679号