二维数组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
相关产品推荐
相关产品推荐

