2012-10-19 128 views
3

我需要寫一洪水填充算法的基礎上,他們是在哪個房間填充不同顏色的水溶洞的特定細胞更大的代碼中使用遞歸 - 洪水填充算法

出於某種原因。我的遞歸算法不起作用,並一直告訴我我超過了最大遞歸深度,我不知道爲什麼。

我試圖通過細胞去細胞,檢測是否是空氣,石,或水,如果是石頭或水,我希望它什麼都不做。如果它是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) 
+0

這真的是最好的迭代完成,而不是遞歸。它會更快,更有效 – jozefg

+0

@jozefg:實現正確的*快速*洪水填充算法難嗎? – krlmlr

+0

行和列有符號還是無符號? –

回答

5

打印rowcolfill程序的開始,看看有什麼錯在這裏。一些代碼重新排序和你的罰款:-)

0

不要使用遞歸算法,它們是魔鬼的玩物。

維基百科列出了各種實用的算法,如掃描線填充。

+1

遞歸是許多實際的問題是一個相當有用的工具。即使掃描線填充通常作爲遞歸解決方案來實現,使用顯式堆棧而不是線程堆棧。 –

+1

@TylerDurden:那麼什麼是功能語言呢?邪惡的化身? ;-) – krlmlr