技术问询:20×20矩阵中4个连续数的最大乘积求解出错
嘿,我来帮你搞定这个20×20矩阵找最大四连数乘积的问题!结合你提到的情况,咱们先梳理清楚问题核心,再排查常见坑,最后给你靠谱的实现参考~
问题核心确认
首先得确保你已经覆盖了所有要求的连续方向:
- 水平向右:同一行内连续4个元素
- 垂直向下:同一列内连续4个元素
- 对角线右下:从左上到右下的连续4个元素
- 对角线左下:从右上到左下的连续4个元素
常见错误点排查
你说已经修正了一处错误,那不妨再检查以下几个大家常踩的坑:
- 方向遗漏:很容易漏掉左下对角线的情况,或者边界处理错误导致数组越界(比如循环时没控制好行/列的范围,取到了矩阵外的元素)
- 初始值设置错误:如果把最大乘积初始设为0,当矩阵中存在四个负数相乘的正乘积时,就会被忽略,正确的初始值应该设为语言支持的最小整数(比如PHP里的
PHP_INT_MIN) - 索引混淆:比如把行和列的索引搞反,或者计算连续元素时索引步长错误(比如多取/少取了元素)
参考实现(PHP版,匹配你的数据格式)
这里给出完整的可运行代码,你可以对照自己的代码排查差异:
// 示例矩阵数据(你可以替换成完整的20×20数据) $data = [ [89,32,92,64,81,2,20,33,44,1,70,75,39,62,76,35,16,77,22,55], [12,45,78,90,23,56,89,10,34,67,91,24,57,80,13,46,79,92,25,58], // 补充剩余18行数据... ]; $maxProduct = PHP_INT_MIN; // 初始化为最小整数,兼容负数乘积场景 $matrixSize = 20; $sequenceCount = 4; // 1. 检查水平向右方向 for ($row = 0; $row < $matrixSize; $row++) { for ($col = 0; $col <= $matrixSize - $sequenceCount; $col++) { $product = $data[$row][$col] * $data[$row][$col+1] * $data[$row][$col+2] * $data[$row][$col+3]; if ($product > $maxProduct) { $maxProduct = $product; } } } // 2. 检查垂直向下方向 for ($row = 0; $row <= $matrixSize - $sequenceCount; $row++) { for ($col = 0; $col < $matrixSize; $col++) { $product = $data[$row][$col] * $data[$row+1][$col] * $data[$row+2][$col] * $data[$row+3][$col]; if ($product > $maxProduct) { $maxProduct = $product; } } } // 3. 检查对角线右下方向(左上→右下) for ($row = 0; $row <= $matrixSize - $sequenceCount; $row++) { for ($col = 0; $col <= $matrixSize - $sequenceCount; $col++) { $product = $data[$row][$col] * $data[$row+1][$col+1] * $data[$row+2][$col+2] * $data[$row+3][$col+3]; if ($product > $maxProduct) { $maxProduct = $product; } } } // 4. 检查对角线左下方向(右上→左下) for ($row = 0; $row <= $matrixSize - $sequenceCount; $row++) { for ($col = $sequenceCount - 1; $col < $matrixSize; $col++) { $product = $data[$row][$col] * $data[$row+1][$col-1] * $data[$row+2][$col-2] * $data[$row+3][$col-3]; if ($product > $maxProduct) { $maxProduct = $product; } } } echo "最大四连数乘积为: " . $maxProduct;
代码关键点说明
- 初始值用
PHP_INT_MIN:确保即使所有乘积都是负数,也能正确找到最大的那个值 - 严格控制循环边界:比如水平方向的列索引最多到16(因为16+3=19,是矩阵最后一列的索引),避免数组越界
- 完整覆盖四个方向:没有遗漏任何要求的连续方向
如果对照后还是找不到问题,你可以把你的代码贴出来,咱们再具体分析细节~
内容的提问来源于stack exchange,提问作者zedling
相关产品推荐
相关产品推荐

