题目信息
给你一个由 '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);
}
}
}
}