2014-04-21 3 views
-3

재귀 적으로 2D 목록을 채울 프로그램을 만들어야합니다. 리스트는 그리드를 형성한다.2D 목록에 반복을 채우는 Python

I - I - I - - - 
I I - - - - - - 
I I I I - - - - 

그런 다음 사용자 입력 열과 행 번호. 그러면 프로그램은 "-"의 해당 부분을 "@"로 채 웁니다. 따라서 행 = 1 및 열 = 4이면 다음과 같이 보입니다.

I - I @ I @ @ @ 
I I @ @ @ @ @ @ 
I I I I @ @ @ @ 

재귀를 수행해야합니다. 내가 할 수있는 유일한 방법은 부분적으로 줄을 채우는 것이었다. 도와주세요.

+3

당신이 – imran

+1

은 [Paintcan] 참조 시도 것을 우리에게 보여주십시오 (http://www.youtube.com/ watch? v = BmLTzeuB_h8). – unutbu

+0

힌트 : floodfill하려면 : 현재 셀을 채운 다음 열려있는 셀을 왼쪽, 오른쪽, 위 및 아래로 채 웁니다. –

답변

1

그리드의 오른쪽 아래에서 시작하여 뒤로 (0, 0)까지 거슬러 올라가면 프로그램이 매우 간단합니다. 로직을 단계별로 살펴 보겠습니다.

  • 사례 (2, 7)에서 오른쪽 아래부터 시작해 보겠습니다. 그리고 당신은 당신의 경우 (0, 3)보다 더 큰 모든 것을 채워야합니다. 이것들은 재귀 적 메소드에 필요한 파라미터들이다.

    recur_fill(input_list, a, b, i, j) 
    
  • 경계 조건으로 시작합니다. 프로그램은 좌표가 0보다 큰 경우에만 실행해야합니다. 즉 i < 0 또는 j < 0 인 경우 중지해야합니다.

    if i < 0 or j < 0: 
        return 
    
  • 지금, 우리는 페인트 경계를 돌봐 즉 A와 B가 필요합니다이에 변환합니다. 우리의 좌표가 경계보다 크면 셀이 -인지 확인하고 @으로 채워야합니다.

    if i >= a and j >= b: 
        if input_list[i][j] == '-': 
         input_list[i][j] = '@' 
    
  • 지금, 우리는 우리의 조건 내에있는 모든 세포가 가득 때까지 반복적으로 세포를 작성해야합니다 : 어느로 변환합니다. 즉,

    recur_fill(input_list, a, b, i - 1, j) 
    recur_fill(input_list, a, b, i, j - 1) 
    

다음을 요약하면, 우리는이 :

from pprint import pprint 

def recur_fill(input_list, a, b, i, j): 
    if i < 0 or j < 0: 
     return 

    if i >= a and j >= b: 
     if input_list[i][j] == '-': 
      input_list[i][j] = '@' 

    recur_fill(input_list, a, b, i - 1, j) 
    recur_fill(input_list, a, b, i, j - 1) 

def main(): 
    input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ], 
        ['I', 'I', '-', '-', '-', '-', '-', '-' ], 
        ['I', 'I', 'I', 'I', '-', '-', '-', '-' ]] 
    recur_fill(input_list, 0, 2, 2, 7) 
    pprint(input_list) 


if __name__ == '__main__': 
    main() 
0
input_list = [['I', '-', 'I', '-', 'I', '-', '-', '-' ], 
       ['I', 'I', '-', '-', '-', '-', '-', '-' ], 
       ['I', 'I', 'I', 'I', '-', '-', '-', '-' ]] 

def fill(x, y): 
    if 0 <= x < len(input_list[0]) and 0 <= y < len(input_list) and input_list[y][x] == '-': 
     input_list[y][x] = '@' 
     fill(x, y + 1) 
     fill(x, y - 1) 
     fill(x + 1, y) 
     fill(x - 1, y) 
    return 

이 주위에 네 이웃을 이동하여 채우기 위해 지점을 검색합니다.

x-y 좌표 (0 시작)이므로주의하십시오. 당신은 행 - 열 (1 시작) 좌표 사용하고자한다면, 단지 다음과 같이 변환 :

fill(column - 1, row - 1) 
관련 문제