在 C++ 中使用 DFS 查找岛屿的数量

在这个问题中,我们得到一个二维二进制矩阵。我们的任务是使用 DFS 查找岛屿的数量。

Island是矩阵中 1 个或多个连接的 1 的接地。

让我们举个例子来理解这个问题,

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

   {0 1 0 1}

   {0 0 0 0}

   {0 0 1 0}}

Output : 3ExplanationIslands are −bin00 - bin11bin13bin32

解决方法

为了使用 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<<"矩阵中存在的岛屿数量为 "<<findIslandCount(bin);

   return 0;

}

输出结果
矩阵中存在的岛屿数量为 4

以上是 在 C++ 中使用 DFS 查找岛屿的数量 的全部内容, 来源链接: utcz.com/z/297096.html

回到顶部