ipqtjmqj 2020-04-21
给你一个由 ‘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); } } } }