深度优先搜索(DFS)之岛屿问题 您所在的位置:网站首页 岛屿数量算法题 深度优先搜索(DFS)之岛屿问题

深度优先搜索(DFS)之岛屿问题

2024-07-13 04:32| 来源: 网络整理| 查看: 265

岛屿

一般算法题目中关于岛屿的问题都是以小地图(二维数组)显示,内部填充的是数字或者是字符。 比如这样的: 这样的 解决岛屿的问题,大多数题目都可以用一个dfs模板

int dfs(vector& grid,int i,int j){ //判断是否出界 if(i = grid.size() || j = grid[0].size() || grid[i][j] == '0') return 0; //往上下左右四个方向进行探索 dfs(grid,i + 1,j); dfs(grid,i - 1,j); dfs(grid,i,j + 1); dfs(grid,i,j - 1); return 1; }

然后根据具体的题目类型在进行修改就OK了。

岛屿的数量

这个简单,只需要记录进入dfs的次数就能知道岛屿的数量。当然,有一个值得注意的地方,我们在深搜的时候,需要将搜索到的岛屿置为‘0’,不然就会导致重复搜索。

例题:200.岛屿的数量

岛屿数量

class Solution { public: int numIslands(vector& grid) { int hen = grid.size(); if(hen == 0) return 0; int shu = grid[0].size(); int ans = 0; for(int i = 0; i if(grid[i][j] == '1'){ dfs(grid,i,j); //进入一次dfs就证明有一个岛屿 ans++; } } } return ans; } int dfs(vector& grid,int i,int j){ if(i = grid.size() || j = grid[0].size() || grid[i][j] == '0') return 0; //将搜索过的岛屿置为0,避免重复搜索 grid[i][j] = '0'; dfs(grid,i + 1,j); dfs(grid,i - 1,j); dfs(grid,i,j + 1); dfs(grid,i,j - 1); return 1; } }; 岛屿的面积

对于这种类型的,本质上就是数有多少个‘1’(以‘0‘,‘1’表示的地图中)。这个时候,我们只需要在dfs中加入一个记数的全局变量就OK啦。

例题:695.岛屿的最大面积

例题 如果是单纯地求面积,我们只需要用全局变量记数就行了。

不过这题比一般的求面积题目要多一个步骤,就是求最大面积。当判断一块岛屿的面积后,还需要与目前最大的面积作比较。

class Solution { public: int num = 0; int maxAreaOfIsland(vector& grid) { int r = grid.size(); int c = grid[0].size(); int ans = 0; for(int i = 0; i //当当前方格为1时,进入深搜 if(grid[i][j] == 1){ num = 0; num = dfs(grid,i,j); if(num > ans) ans = num; } } } return ans; } int dfs(vector& grid,int n,int m){ if(n = grid.size() || m = grid[0].size() || grid[n][m] == 0) return 0; //用全局变量num记数 num++; grid[n][m] = 0; dfs(grid,n - 1,m); dfs(grid,n + 1,m); dfs(grid,n,m + 1); dfs(grid,n,m - 1); return num; } }; 岛屿的周长

这个问题得稍微转一下脑子。

岛屿的周长即与非岛屿区域(海水区+边界)交界的长度。当碰到这些区域时,周长就+1。

那具体的题目说明吧!例题 463. 岛屿的周长 在这里插入图片描述

//深搜,求的周长就是相当于判断边界的时候 //岛屿的周长就是岛屿方格和非岛屿方格(水方格和边界)相邻的边的数量。 class Solution { public: int islandPerimeter(vector& grid) { int lenn = grid.size(); if(lenn == 0) return 0; int lenm = grid[0].size(); for(int i = 0; i if(grid[i][j] == 1){ return dfs(grid,i,j); } } } return 0; } int dfs(vector& grid, int n, int m){ //当碰到边界时,返回1 if(n = grid.size() || m = grid[0].size()) return 1; //当碰到海水时,返回1 if(grid[n][m] == 0) return 1; //当碰到已经搜索过的区域,返回0 if(grid[n][m] != 1) return 0; //深搜过的岛屿置为2,避免重复搜索 grid[n][m] = 2; //利用变量ans记录周长 int ans = 0; ans += dfs(grid,n,m - 1); ans += dfs(grid,n,m + 1); ans += dfs(grid,n + 1,m); ans += dfs(grid,n - 1,m); return ans; } };

以上就是我在做题过程中碰到的关于岛屿的问题的一些自己的看法与总结。如果大家有什么看法,欢迎大家指正。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有