岛屿类-网格类问题-DFS | 力扣200. 岛屿数量
生活随笔
收集整理的這篇文章主要介紹了
岛屿类-网格类问题-DFS | 力扣200. 岛屿数量
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 本文講解200. 島嶼數量問題,屬于常見的島嶼類-網格類問題
- 本題使用DFS的思想
1 題目
給你一個由 ‘1’(陸地)和 ‘0’(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,并且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。
此外,你可以假設該網格的四條邊均被水包圍。
2 示例
3 思路分析
看見題目就想到使用 DFS 算法,但是使用 DFS我們應該留意幾個問題
對比二叉樹的 DFS算法
- 如果 結點是葉子結點,返回 - 否則,訪問其左右結點放在島嶼問題中,我們把島嶼簡化為一個網格
那么如何在這個網格中進行 DFS 呢
類別二叉樹的 DFS,得出
- 如果是網格之外的結點,返回 - 否則,訪問其上下左右,四個結點這樣,我們就得到了大致框架,
但是還需要注意一個問題就是重復訪問的問題
否則在網格中很容易出現死循環,
因此,我們可以對訪問過的進行標記,由 1 變成 2,代碼這個島嶼我們已經訪問過了~
同時這個題還應該留意以下,網格中的是 ‘1’,而不是 1
(我丟,檢查了幾遍~~,一定要細心!)
4 代碼
class Solution { public:int numIslands(vector<vector<char>>& grid) {int res = 0;for (int line = 0; line < grid.size(); line ++)for (int row = 0; row < grid[0].size(); row ++)if (grid[line][row] == '1') {dfslands(grid,line,row);res ++;}return res;}// 判斷是否在二維網絡中bool in_area(vector<vector<char>>& grid,int line,int row) {return 0 <= line && line < grid.size() && 0 <= row && row < grid[0].size();}void dfslands(vector<vector<char>>& grid,int line,int row) {if (!in_area(grid,line,row)) {return;}if (grid[line][row] != '1') { // 不用 == 0 ,因為后面訪問了的會改為2return;}grid[line][row] = '2' ; // 訪問過這個島嶼dfslands (grid, line - 1,row);dfslands (grid, line + 1,row);dfslands (grid, line,row + 1);dfslands (grid, line,row - 1);} };懂了 DFS 的套路,可以解決很多類似的網格類問題~
總結
以上是生活随笔為你收集整理的岛屿类-网格类问题-DFS | 力扣200. 岛屿数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双指针算法 | 力扣344. 反转字符串
- 下一篇: 岛屿类-网格类问题-DFS | 力扣69