数据结构之岛屿数量
Posted muzichenyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构之岛屿数量相关的知识,希望对你有一定的参考价值。
题目信息
给你一个由 ‘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); } } } }
题目链接
以上是关于数据结构之岛屿数量的主要内容,如果未能解决你的问题,请参考以下文章