C++ 中查找由所有 1 组成的最佳 '+' 形状的矩阵

2025年3月25日 | 阅读 4 分钟

在计算机科学和算法问题解决中,寻找各种问题的有效答案经常会让我们遇到以组合逻辑为核心的迷人谜题。其中一个问题是,找出由二进制矩阵中所有 1 组成的最大的“加号”('+')的大小。想象一个二维二进制网格,其中每个单元格都可以是 0 或 1。我们的目标是找到完全由 1 组成的最大的十字形结构('+')。这个结构必须满足几个要求:它的臂必须垂直和水平延伸,交叉点由中心单元格表示。此外,加号的臂不能交叉或超出矩阵的边界。

示例

输出

5

方法

解决该问题的一个简单方法是确定最大的“+”,这需要找出矩阵中某一点在一个方向上连续 1 的最大数量,并且该数量在所有四个方向上对于给定的 1 必须相同。我们将通过为该点的每一侧创建一个矩阵(或 4 个矩阵)来做到这一点。对于给定的元素,每个矩阵都将记录连续 1 的总数。对于每个索引值,我们将确定最大值,即四个方向上所有后续值的最小值。

示例 1

让我们看一个 C++ 程序来查找给定二进制矩阵中由所有 1 组成的最大的“+”的大小。

输出

Size of the largest '+' formed by all 1's: 9

说明

此 C++ 程序的目的是找出给定二进制矩阵中仅包含 1 的最大加号('+')的大小。之后,它首先初始化数组,并存储矩阵中每个单元格左、右、上、下连续 1 的最大数量。这些数组通过遍历矩阵并更新每个方向上连续 1 的计数来填充。最后,程序使用中心单元格和四个方向上长度为 (n - 1) 的四个臂来确定并返回最大加号的大小。返回零表示没有找到加号,这意味着最大大小为零。


下一个主题2-sat-problem-in-cpp