在 C++ 中查找二进制矩阵中由全 1 构成的最大“+”号的大小


在这个问题中,我们给定一个 NxN 的二进制矩阵 bin[][]。我们的任务是找到由二进制矩阵中所有 1 构成的最大“+”号的大小。

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

输入

0 1 1
1 1 1
0 1 0

输出

5

解决方案方法

解决这个问题的一个简单方法是找到最大的“+”号,为此我们需要找到矩阵中某个点在某个方向上 1 的最大数量,对于给定的 1,这在所有四个方向上都需要相同。为此,我们将为点的每个方向(即 4 个方向)创建一个矩阵。每个矩阵将存储给定元素连续 1 的数量。对于所有索引值,我们将找到最大值,该最大值是所有四个方向上所有连续 1 的最小值。

程序说明我们解决方案的工作原理,

示例

 在线演示

#include <iostream>
using namespace std;
#define N 7
int findLargestPlusSize(int mat[N][N]) {
   int conOneLeft[N][N], conOneRight[N][N], conOneTop[N][N], conOneBottom[N][N];
   for (int i = 0; i < N; i++) {
      conOneTop[0][i] = mat[0][i];
      conOneBottom[N - 1][i] = mat[N - 1][i];
      conOneLeft[i][0] = mat[i][0];
      conOneRight[i][N - 1] = mat[i][N - 1];
   }
   for (int i = 0; i < N; i++) {
      for (int j = 1; j < N; j++) {
         if (mat[i][j] == 1)
            conOneLeft[i][j] = conOneLeft[i][j - 1] + 1;
         else
            conOneLeft[i][j] = 0;
         if (mat[j][i] == 1)
            conOneTop[j][i] = conOneTop[j - 1][i] + 1;
         else
            conOneTop[j][i] = 0;
         j = N - 1 - j;
         if (mat[j][i] == 1)
            conOneBottom[j][i] = conOneBottom[j + 1][i] + 1;
         else
            conOneBottom[j][i] = 0;
         if (mat[i][j] == 1)
            conOneRight[i][j] = conOneRight[i][j + 1] + 1;
         else
            conOneRight[i][j] = 0;
         j = N - 1 - j;
      }
   }
   int maxConOne = 0;
   for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++){
         int ConOnes = min(min(conOneTop[i][j],
         conOneBottom[i][j]), min(conOneLeft[i][j], conOneRight[i][j]));
         if(ConOnes > maxConOne)
            maxConOne = ConOnes;
      }
   }
   if (maxConOne)
      return (4 * (maxConOne - 1) + 1);
   return 0;
}
int main() {
   int mat[N][N] = {
      { 1, 0, 1, 1, 1, 1, 0 },
      { 1, 0, 1, 0, 1, 1, 1 },
      { 1, 1, 1, 0, 1, 1, 0 },
      { 0, 0, 0, 0, 1, 0, 0 },
      { 1, 0, 1, 1, 1, 1, 1 },
      { 1, 1, 1, 0, 1, 1, 1 },
      { 1, 0, 0, 0, 1, 0, 0 },
   };
   cout<<"The size of the largest plus formed by ones is "<<findLargestPlusSize(mat);
   return 0;
}

输出

The size of the largest plus formed by ones is 9

更新于: 2021年3月16日

156 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告