数据结构之岛屿数量

题目信息

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
输入示例:
    输入:
    11110
    11010
    11000
    00000
    输出: 1

    输入:
    11000
    11000
    00100
    00011
    输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

解题思路

利用广度优先搜索,遍历这个二维数组,找到为1的数据将其赋值为2(2代表已经遍历过),
同时遍历该数据的上下左右,将所有为1的数据赋值为2,并将计数加一。直至遍历结束

代码

class land {
    // 1为岛屿 0为海 2代表已经遍历过得数据
    let flag: Character = "2";
    let water: Character = "0";
    let land: Character = "1";
    // 用来保存二维数据的行数和列数
    var width = 0;
    var height = 0;
    // 下面两个数组用来遍历一个数据的上下左右
    let xArray = [-1, 1, 0, 0];
    let yArray = [0, 0, -1, 1];
    
    func numIslands(_ grid: [[Character]]) -> Int {
        if grid.isEmpty {
            return 0;
        }
        var map = grid
        width = grid.first?.count ?? 0;
        height = grid.count;
        var number = 0;
        
        for row in 0..<height {
            for col in 0..<width {
                if map[row][col] == land {
                    number += 1;
                    // 遍历为岛屿数据的上下左右
                    traverseMap(&map, row: row, col: col);
                }
            }
        }
        return number;
    }
    
    func traverseMap(_ map: inout [[Character]], row: Int, col: Int) {
        // 将遍历过原本为岛屿的数据赋值为falg
        map[row][col] = flag;
        var nextRow: Int = 0;
        var nextCol: Int = 0;
        // 分别往该数据的上下左右遍历
        for i in 0..<xArray.count {
            nextRow = row + xArray[i];
            nextCol = col + yArray[i];
            if nextRow >= 0 && nextRow < height && nextCol >= 0 && nextCol < width && map[nextRow][nextCol] == land {
                traverseMap(&map, row: nextRow, col: nextCol);
            }
        }
    }
}

题目链接

posted @ 2020-04-21 16:35  木子沉雨  阅读(286)  评论(0编辑  收藏  举报