You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

二维数组Plus图案检测问题求助:求学习方向与算法指导

加号图案检测问题的学习方向指导

我并非寻求问题的解决方案,仅需要相关指导。在解决二维数组中加号图案检测问题时陷入困境,不知道该学习哪些知识或算法,尝试的多种方案均存在bug,恳请提供帮助。

问题详情

给定一个N×M的矩阵(2≤N≤15,2≤M≤15),每个单元格的值为0或1。需检测由值为1的连通单元格构成的加号图案——构成加号的四条线段长度相同且垂直相交于中心。编写程序统计有效加号的数量以及这些加号包含的1的单元格总数。

我尝试的C++代码

#include <iostream>
using namespace std;
int main() {

    int column = 8; // this is N
    int row = 8; // this is M
    int pluses = 0;
    int addition = 1;
    int ones = 0;
    bool could_be_plus = true;

    int example[row][column];
    cout << "Place values [0] or [1]\n";
    for (int i = 0; i < row; ++i)
        for (int j = 0; j < column; ++j)
            cin >> example[i][j];
    cout << endl;

    for (int i = 1; i < row - 1; ++i) {
        for (int j = 1; j < column - 1; ++j) {
            could_be_plus = true;
            while (could_be_plus) {
                //addition variable controls the number of layer outside first plus
                if (example[i][j - addition] == 1 && example[i - addition][j] == 1 && example[i + addition][j] == 1 && example[i][j + addition] == 1) {
                    if (addition == 1) {
                        pluses++;
                        //including the center there are 5 ones
                        ones += 5;
                        addition++;
                    }
                    else {
                        ones += 4;
                        addition++;
                    }
                }
                else {
                    could_be_plus = false;
                    addition = 1;
                }
            }
        }
        cout << endl;
    }
    cout << "pluses: " << pluses << endl;
    cout << "number of 1s: " << ones << endl;
};

学习方向与参考思路

  • 二维数组边界处理:你的代码跳过了边缘单元格,但在延伸判断时容易忽略数组越界问题,先吃透如何安全访问二维数组元素,避免越界错误,这是基础中的基础。
  • 中心优先验证法:加号的核心是中心单元格,先确认中心是1,再向上下左右四个方向逐格扩展,每一步必须保证四个方向的对应位置都是1,且长度严格一致。这个思路适合小矩阵场景(你的N/M最大15,完全够用)。
  • 预处理优化技巧:可以预先为每个单元格计算四个方向上连续1的最大长度(比如left[i][j]表示(i,j)向左连续1的个数,up/right/down同理),后续判断某个点能形成多大的加号时,直接取四个方向长度的最小值即可,避免重复遍历,效率更高。
  • 严格形状校验:要区分加号和其他连通的1,比如相邻的非加号1会干扰判断,所以判断时只关注四条臂的严格长度一致,不要把额外的1纳入判断逻辑。
  • 调试技巧:遇到相邻单元格的bug时,在代码中加入打印逻辑,输出当前判断的中心坐标、延伸长度、对应位置的数值,直观定位错误点,比如是不是把不属于加号的1当成了臂的一部分。

内容的提问来源于stack exchange,提问作者IrdiZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 03:20:59