2012-10-19 5 views
3

기입재귀 - 홍수 나는 그들이에있는 객실 등의 기준에 따라 물을 다른 색상으로 동굴의 특정 세포를 채우는 큰 코드에서 사용할 수 홍수 채우기 알고리즘을 작성해야 알고리즘

어떤 이유로. 내 재귀 알고리즘이 작동하지 않고 계속 최대 재귀 수준을 초과한다는 사실을 계속해서 알려줍니다. 이유는 없습니다.

저는 셀 단위로 이동하려고합니다. 공기, 석재 또는 물인지 확인하고, 돌이나 물이라면 아무 것도하지 않기를 원합니다. AIR 인 경우 해당 셀을 채우기를 원합니다.

아무도 내게 조언이나 조언을 줄 수 있습니까? fill 루틴의 시작

#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 : 정확한 * fast * flood fill 알고리즘을 구현하는 것이 다소 어렵지 않습니까? – krlmlr

+0

행과 열은 부호가 있거나 부호가 있습니까? –

답변

5

인쇄 rowcol 여기에 문제가 있는지 확인합니다. 작은 코드 순서를 바꾸면 괜찮습니다 :-)

0

그들은 재귀 알고리즘을 사용하지 마십시오. 악마의 장난입니다.

위키 백과는 주사선 채우기와 같은 다양한 실용적인 알고리즘을 나열합니다.

+1

재귀는 많은 실제 문제에있어 매우 유용한 도구입니다. 주사선 채우기조차도 일반적으로 스레드의 스택 대신 명시 적 스택을 사용하는 재귀 적 솔루션으로 구현됩니다. –

+1

@TylerDurden : 그렇다면 기능적 언어는 무엇입니까? 악의 화신? ;-) – krlmlr