使用 DFS 尋找島嶼數 (C++)


在本題中,我們給定了一個 2D 二進位制矩陣。我們的任務是使用 DFS 找到島嶼數量。

島嶼是指矩陣中 1 或多個相連的 1。

讓我們舉個例子來理解該問題:

Input : bin[][] = {{ 1 0 0 0}
   {0 1 0 1}
   {0 0 0 0}
   {0 0 1 0}}
Output : 3

Explanation

Islands are −bin00 - bin11

bin13

bin32

解題思路

要使用 DFS 來解決問題,我們將使用 DFS 技術探索矩陣中所有的相鄰位置(每個數字可能多達 8 個相鄰位置),並查詢 1。如果我們遇到一個未訪問過的值為 1,那麼我們將考慮它。我們將對已訪問的值進行檢查,以避免重複訪問。透過這樣做,我們可以計算矩陣中存在的島嶼數量。

瞭解圖上的 DFS

瞭解圖

示例

#include <bits/stdc++.h>
using namespace std;
#define ROW 5
#define COL 5
int canVisit(int bin[][COL], int row, int col, bool visited[][COL]){
   return (row >= 0) && (row < ROW) && (col >= 0) && (col < COL) && (bin[row][col] && !visited[row][col]);
}
void DFS(int bin[][COL], int row, int col, bool visited[][COL]){
   static int getNeighbourRow[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
   static int getNeighbourCol[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
   visited[row][col] = true;
   for (int k = 0; k < 8; ++k)
      if (canVisit(bin, row + getNeighbourRow[k], col + getNeighbourCol[k], visited))
         DFS(bin, row + getNeighbourRow[k], col + getNeighbourCol[k], visited);
}
int findIslandCount(int bin[][COL]){
   bool visited[ROW][COL];
   memset(visited, 0, sizeof(visited));
   int islandCount = 0;
   for (int i = 0; i < ROW; ++i)
   for (int j = 0; j < COL; ++j)
   if (bin[i][j] && !visited[i][j]) {
      DFS(bin, i, j, visited);
      islandCount++;
   }
   return islandCount;
}
int main(){
   int bin[][COL] = {{1, 0, 0, 0},
   {0, 1, 0, 1},
   {0, 0, 0, 0},
   {0, 0, 1, 0}};
   cout<<"The number of islands present in the matrix is "<<findIslandCount(bin);
   return 0;
}

輸出

The number of islands present in the matrix is 4

更新時間:11-Feb-2022

215 次瀏覽

開啟您的職業

完成課程即可獲得認證

開始吧
廣告
© . All rights reserved.