在c ++中查找2d数组中的最大区域

use*_*504 8 c++ arrays 2d area

我需要在c ++中编写递归函数,在2d数组中找到最大区域的数字'1',只包含1或0.

例:

int Arr[5][8] =
{
{ 0, 0, 0, 0, 1, 1, 0, 0, },
{ 1, 0, 0, 1, 1, 1, 0, 0, },
{ 1, 1, 0, 1, 0, 1, 1, 0, },
{ 0, 0, 0, 1, 1, 1, 1, 0, },
{ 0, 1, 1, 0, 0, 0, 0, 0, },
};
Run Code Online (Sandbox Code Playgroud)

可视化示例:http://s23.postimg.org/yabwp6h23/find_largest.png

该阵列的最大区域为12,第二大区域为3,第三大区域为2.

我想用洪水填充算法做类似的事情,但是无法弄清楚如何.

NPE*_*NPE 2

我想用类似于洪水填充算法的方法来做到这一点

我认为这是一个非常好的方法。对任何应用洪水填充1,计算其中的个数并将其替换为零。

重复直到网格完全由零组成。

以下将打印出连接组件的大小(不按特定顺序排列):

#include <iostream>

constexpr int N = 5;
constexpr int M = 8;

int arr[N][M] =
{
{ 0, 0, 0, 0, 1, 1, 0, 0, },
{ 1, 0, 0, 1, 1, 1, 0, 0, },
{ 1, 1, 0, 1, 0, 1, 1, 0, },
{ 0, 0, 0, 1, 1, 1, 1, 0, },
{ 0, 1, 1, 0, 0, 0, 0, 0, },
};

int fill(int arr[N][M], int r, int c) {
  int count = 0;
  if (r < N && arr[r][c]) {
    for (int i = c; i >= 0 && arr[r][i]; --i) {
      arr[r][i] = 0;
      count += fill(arr, r + 1, i) + 1;
    }
    for (int i = c + 1; i < M && arr[r][i]; ++i) {
      arr[r][i] = 0;
      count += fill(arr, r + 1, i) + 1;
    }
  }
  return count;
}

int print_components(int arr[N][M]) {
  for (int r = 0; r < N; ++r) {
    for (int c = 0; c < M; ++c) {
      if (arr[r][c]) {
        std::cout << fill(arr, r, c) << std::endl;
      }
    }
  }
}

int main() {
  print_components(arr);
}
Run Code Online (Sandbox Code Playgroud)