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向量里存储的不是指向实际单元格对象的有效指针,而是重复指向了同一个单元格(比如初始调用的那个单元格),或者指向了临时对象/无效内存。
建议做以下排查:
- 检查邻居指针的赋值逻辑:确保在初始化每个
cell的neighbors时,确实把相邻的其他单元格对象的地址存进去了,而不是当前单元格自身的地址,或者未初始化的野指针。 - 打印指针地址验证:在
fill()里添加一行cout << this << " " << neighbors[i] << endl;,对比当前单元格的this指针和邻居指针的地址,如果邻居指针和当前单元格地址相同,说明指针赋值错误。 - 检查
filled成员变量的定义:确保它是cell类的非静态成员变量,如果误设为static,所有单元格会共享同一个filled值,导致递归时后续调用的条件不满足。
另外,递归填充这种场景要注意栈溢出问题,不过当前你的问题还没到这一步,先解决指针和变量的问题。
内容的提问来源于stack exchange,提问作者j.dow
相关产品推荐
相关产品推荐

