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

Flood Fill算法行为异常:递归填充邻居单元格失效求助

问题描述

我正在开发一个程序,用于填充由障碍单元格和可通行单元格组成的二维数组。我定义了一个名为cell的类,每个单元格拥有一个指向其邻居的指针向量。当调用成员函数fill()时,会在单元格非障碍且未被填充的情况下将其标记为已填充,随后递归调用所有邻居的fill()方法,代码如下:

void cell::fill() {
    if (barrier == false && filled == false) {
        filled = true;

        cout << "filling" << endl;

        for (int i = 0; i < neighbors.size(); i++) {
            neighbors[i] -> fill();
        }
    }
}

当我调用某个单元格的fill()时,该单元格会被填充,但所有邻居单元格并未被填充。不过程序会为每个可通行邻居输出"filling"提示,但似乎并未将这些邻居的filled属性设为true。这是我首次使用指针且缺乏类相关经验,是否遗漏了明显的问题?我怀疑是成员函数递归调用的逻辑不符合预期。

编辑补充:以下是输出效果,黑色矩形代表障碍,空格代表空单元格,星号代表已填充单元格:

filling
filling
 ██   █
██  ███
    ██
█ █*█ █
   █
 ██ █ █
█   █ █
可能的问题与解决思路

从现象和代码来看,核心问题大概率出在邻居指针的初始化上:

  • 你看到每个可通行邻居都输出了"filling",说明递归确实触发了邻居的fill()方法,但邻居的filled没被设置为true,这意味着邻居调用fill()时,barrier == false && filled == false这个条件没满足。
  • 排除barrier误设的情况,最可能的是:你的neighbors向量里存储的不是指向实际单元格对象的有效指针,而是重复指向了同一个单元格(比如初始调用的那个单元格),或者指向了临时对象/无效内存。

建议做以下排查:

  1. 检查邻居指针的赋值逻辑:确保在初始化每个cell的neighbors时,确实把相邻的其他单元格对象的地址存进去了,而不是当前单元格自身的地址,或者未初始化的野指针。
  2. 打印指针地址验证:在fill()里添加一行cout << this << " " << neighbors[i] << endl;,对比当前单元格的this指针和邻居指针的地址,如果邻居指针和当前单元格地址相同,说明指针赋值错误。
  3. 检查filled成员变量的定义:确保它是cell类的非静态成员变量,如果误设为static,所有单元格会共享同一个filled值,导致递归时后续调用的条件不满足。

另外,递归填充这种场景要注意栈溢出问题,不过当前你的问题还没到这一步,先解决指针和变量的问题。

内容的提问来源于stack exchange,提问作者j.dow

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:02:29