我目前正在制作一个使用 floodfill 递归的程序(例如将带有黑色边框的白色圆圈填充为不同的颜色)。当我点击我的图像进行填充时,只有圆圈的一部分会被填充成不同的颜色,然后我得到了递归错误。我的代码中唯一具有递归的部分就是这个。
def floodfill(x,y):
floodfill(x+1,y)
floodfill(x-1,y)
floodfill(x, y+1)
floodfill(x, y-1)
请您参考如下方法:
你通过不使用递归来做到这一点;您会遇到半径与递归限制相匹配的圆的递归限制,默认为 1000,并且不能任意提高该限制。请改用迭代方法。您可以在此处使用队列执行此操作:
from collections import deque
def floodfill(x, y, _directions=((-1, 0), (0, -1), (1, 0), (0, 1))):
queue = deque([(r, c)])
handled = {(r, c)}
while queue:
r, c = queue.popleft()
for dr, dc in _directions:
nr, nc = r + dr, c + dc
if (nr, nc) not in handled:
handled.add((nr, nc))
queue.append((nr, nc))
# do something with these coordinates, like filling
# this position in an image.
我用了一个集合来跟踪这里还没有处理的坐标;您的应用程序可能有更简单的方法来执行相同操作(例如简单地测试填充颜色是否已应用于该像素)。
您还可以在相同的 if 测试位置测试边界条件。如果那里的像素已经是黑色,您也会忽略这些坐标。
