递归 岛屿问题

79 阅读1分钟

题目

给定一个矩阵,只有0和1两值,每个岛位置为1,岛可以和上下左右任意位置的岛连接,多个岛连接起来的岛称作一片岛屿,求一共几片岛屿

/** 如下有三个岛屿
 * [0,0,1,0,1,0]
 * [1,1,1,0,1,0]
 * [1,0,0,1,0,0]
 * [0,0,0,0,0,0]
 */
  • 通过感染的思路,当遍历到1时,构造上下左右到递归结果,去感染所有的1,将其设置成2,最终外部触发几次感染就有几片岛屿
/**
 * [0,0,1,0,1,0]
 * [1,1,1,0,1,0]
 * [1,0,0,1,0,0]
 * [0,0,0,0,0,0]
 */

function islands(arr) {
  // 获取行、列
  const line = arr.length;
  const column = arr[0].length;

  let res = 0;
  for (let i = 0; i < line; i++) {
    for (let j = 0; j < column; j++) {
      if (arr[i][j] === 1) {
        res++;
        infect(i, j, arr, line, column);
      }
    }
  

  function infect(i, j, arr, line, column) {
    if (arr[i][j] !== 1 || i > line || j > column || i < 0 || j < 0) {
      return;
    }
    arr[i][j] = 2;
    // 上
    infect(i - 1, j, arr, line, column);
    // 右
    infect(i, j + 1, arr, line, column);
    // 下
    infect(i + 1, j, arr, line, column);
    //左
    infect(i, j - 1, arr, line, column);
  }
  
  return res;
}