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

C++扫雷代码中OpenVoidCells递归函数栈溢出的原因是什么

扫雷空白展开函数栈溢出原因分析

直接原因

代码存在无限递归问题,递归调用深度无限制增长,最终耗尽栈空间触发溢出。

具体问题点

  • 边界检查不完整
    现有代码仅判断了x >= FIELD_NUM、y >= FIELD_NUM的越界情况,没有补充x < 0、y < 0的判断。当递归向x-1、y-1方向调用时,坐标会变为负数,不会触发返回逻辑,会持续进行无效递归。
    另外根据你的注释设计,有效游戏区域是坐标1 ~ FIELD_NUM,外围的0坐标是非活动区,更合理的边界判断应该直接拦截所有不在有效范围内的坐标:
    if (x < 1 || y < 1 || x > FIELD_NUM || y > FIELD_NUM)
        return;
    
  • 没有标记已访问的空白单元格,导致递归死循环
    空白单元格(gridLogic[x][y] == 0)被处理后,你没有修改它的状态或者新增访问标记,相邻单元格递归回到当前单元格时,会再次判定为未处理的空白格,重复触发递归调用。比如单元格(2,2)调用相邻的(2,3),(2,3)遍历相邻单元格时又会调用(2,2),二者来回无限调用,栈空间很快被耗尽。

修复建议

你可以在给view[x][y]赋值后,给已处理的空白格打一个终止条件里存在的标记值(比如10、11这类不会被判定为空白格的值),避免重复递归:

view[x][y] = gridLogic[x][y];
// 新增:标记当前空白格已处理,避免重复递归
gridLogic[x][y] = 10;
// 再执行相邻单元格的递归调用
OpenVoidCells(view,x + 1, y); 
// 其余递归调用不变

如果你不想修改原始的gridLogic数据,也可以单独维护一个和网格同尺寸的布尔访问数组,标记已经处理过的单元格,递归时先判断是否已经访问过,访问过直接返回。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:39:02