• 岛屿的周长


    题目

    给定一个 row x col 的二维网格地图 grid ,其中:grid[i][j] = 1 表示陆地, grid[i][j] = 0 表示水域。

    网格中的格子 水平和垂直 方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。

    岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。

    输入:grid = [[0,1,0,0],[1,1,1,0],[0,1,0,0],[1,1,0,0]] 输出:16 解释:它的周长是上面图片中的 16 个黄色的边 示例 2:

    输入:grid = [[1]] 输出:4 示例 3:

    输入:grid = [[1,0]] 输出:4

    解题思路

    DFS(深度遍历搜索)

    岛就一个,我们从第一个遇到的土地开始深搜。

    对于每个土地节点,做一些事情,基于它,递归上下左右四个点,做同样的事情。做什么事情呢?

    从土地到土地,之间不会产生周长,但从土地迈入海洋,之间会产生 1 个周长,从土地迈出矩阵边界,也会产生 1 个周长。

    dfs 的过程中,对当前点的上下左右递归,下一个递归的点又对上下左右递归,就会造成重复访问,造成周长的重复计算。

    遍历过的土地节点,将值改为 2,区分于 1 和 0,代表访问过了。

    代码

    package main
    
    import "fmt"
    
    func islandPerimeter(nums [3][3]int) int {
    	row, col := len(nums), len(nums[0])
    
    	for i :=0; i < row; i++ {
    
    		for j := 0; j < col;j++ {
    			if nums[i][j] == 1 {
    				return infectNums(nums, i, j)
    			}
    
    		}
    	}
    
    	return 0
    }
    
    func infectNums(nums [3][3]int, row, col int) int {
    	if row < 0 || row >= len(nums[0]) || col < 0 || col >= len(nums) {
    		return 1
    	}
    
    	if nums[row][col] == 0 {
    		return 1
    	}
    
    	if nums[row][col] == 2 {
    		return 0
    	}
    
    	nums[row][col] = 2
    
    	return infectNums(nums, row-1, col) + infectNums(nums, row+1, col) + infectNums(nums, row, col-1) + infectNums(nums, row, col+1)
    
    }
    
    func main() {
    	nums := [3][3]int{
    		{0,1,0},
    		{1,1,0},
    		{0,1,1},
    	}
    	res := islandPerimeter(nums)
    	fmt.Println(res)
    }
    

      

  • 相关阅读:
    Rainmeter 雨滴桌面 主题分享
    行人检測之HOG特征(Histograms of Oriented Gradients)
    const和readonly差别
    ADB命令解析
    Java实现 蓝桥杯VIP 算法训练 接水问题
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
    Java实现 蓝桥杯VIP 算法训练 星际交流
  • 原文地址:https://www.cnblogs.com/smallleiit/p/14084212.html
Copyright © 2020-2023  润新知