【问题标题】:Recursion - Flood Fill Algorithm递归 - 洪水填充算法
【发布时间】:2012-10-19 02:49:45
【问题描述】:

我需要编写一个洪水填充算法,以便在更大的代码中使用,该代码根据洞穴所在的房间用不同颜色的水填充洞穴的特定单元。

由于某种原因,我的递归算法不起作用,并一直告诉我超出了最大递归深度,我不知道为什么。

我正在尝试逐个单元格地检查它是 AIR、STONE 还是 WATER,如果是 STONE 或 WATER,我希望它什么也不做。如果是 AIR,我希望它填充该单元格。

谁能给我一些提示或建议?

#flood fill algorithm
def fill(cave, row, col, color):

    caveWidth = len(cave)
    caveHeigth = len(cave[0])


    if row > 0:
        fill(cave, row-1, col, color) #left
    if col > 0:
        fill(cave, row, col-1, color) #up
    if row < caveWidth-1:
        fill(cave, row+1, col, color) #right
    if col < caveHeigth-1:
        fill(cave, row, col+1, color) #down

    if cave[row][col] == STONE or cave[row][col] == WATER:
        return

    if cave[row][col] == AIR : 
        cave[row][col] = WATER
        grid.fill_cell(row, col, color)

【问题讨论】:

  • 这确实是最好的迭代而不是递归。它会更快更高效
  • @jozefg:实现一个正确的fast洪水填充算法不是很困难吗?
  • 行和列是有符号还是无符号?
  • @user946850 true... 虽然广度优先搜索版本更节省空间并且还避免了递归。只需使用队列而不是调用堆栈

标签: algorithm recursion fill flood-fill


【解决方案1】:

fill 例程的开头打印rowcol,看看这里出了什么问题。一些代码重新排序,你很好:-)

【讨论】:

    【解决方案2】:

    不要使用递归算法,它们是魔鬼的玩物。

    维基百科列出了各种实用算法,如扫描线填充。

    【讨论】:

    • 递归对于许多实际问题来说是一个非常有用的工具。甚至扫描线填充通常也实现为递归解决方案,使用显式堆栈而不是线程堆栈。
    • @TylerDurden:那么什么是函数式语言?邪恶的化身? ;-)
    猜你喜欢
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多