2013-10-22 3 views
0

바이너리 그리드 안에 숫자를 배치하는 기능을 만드는 데 문제가 있습니다. 예를 들어, 는 내가 4 3 2 1 주어, 나는 5 × 5 인 그리드가있어 경우, 그것은2D 바이너리 목록 파이썬

4 4 4 4 1 
4 4 4 4 0 
4 4 4 4 0 
4 4 4 4 0 
0 0 0 0 0 

내 현재 코드는 텍스트 파일을 읽고 목록을 만듭니다 ... 다음과 같을 것이다 그것은 내림차순으로 정렬됩니다. 예를 들어 텍스트 파일에 1 2 3이 있으면 정수 목록을 생성합니다. 3 2 1 또한 binxbin 사각형을 만드는 bin #에 대한 프롬프트가 나옵니다. 나는 빈에 실제로 4 번 자리에 앉는 법을 모른다. 이것은 내가 붙어있는 값에 위치해야하는 함수입니다. 당신이 원산지 원산지 (row, column) 및 크기 block과 정사각형을 만들 수 있다면 isSpaceFree가 경계의 외출 또는 0이 아닌 요소를 중복하지 않고, True을 반환해야처럼

def isSpaceFree(bin, row, column, block): 
    if row + block > len(bin): 
     return False 
    if column + block > len(bin): 
     return False 
    if bin[row][column] == 0 : 
     return True 
    else: 
     return False 
    for r in range(row, row+block): 
     if bin[row][column] != 0: 
+1

이 바이너리 목록입니다? 나는 혼란 스럽다. 네 광장에 무엇을 넣고 싶니? 숫자 '4'? – Brionius

+0

그래서 숫자 4가 목록의 첫 번째 숫자이면 4x4 블록을 만듭니다. 원래 목록에는 5x5 저장소에 0이 포함되어 있습니다. 4가 0을 대체합니다. 그리고 다시 3과 2와 1을 확인하기 위해 위로부터 시작할 것입니다. – steve

+0

저는 매우 혼란 스럽습니다. 어떤 의미에서'4 3 2 1','1 2 3' 또는'3 2 1'은 5x5 격자를 채우는 것과 관련이 있습니까? 항상 5x5 격자입니까? –

답변

1

는 소리가 난다. 어떤 경우에, 당신은 그 길의 75 %입니다. 경계가 준비되었는지 확인하고 중복 검사 루프의 절반을 확인합니다.

그런 다음 실제로 블록을 배치하는 것은 동일한 이중 중첩 루프이지만 대신 할당을 수행합니다.

def place(bin, row, column, block): 
    if isSpaceFree(bin, row, column, block): 
     for r in range(row, row+block): 
      for c in range(column, column+block): 
       bin[r][c] = block 

x = [ 
[0,0,0,0,0], 
[0,0,0,0,0], 
[0,0,0,0,0], 
[0,0,0,0,0], 
[0,0,0,0,0], 
] 

place(x, 0, 0, 4) 

print "\n".join(str(row) for row in x) 

결과 : 어떤 의미에서

[4, 4, 4, 4, 0] 
[4, 4, 4, 4, 0] 
[4, 4, 4, 4, 0] 
[4, 4, 4, 4, 0] 
[0, 0, 0, 0, 0] 
+0

안녕하세요. @ 케빈, 도움 주셔서 감사합니다. 나는 2 가지 일에 어려움을 겪고있다. 첫 번째는 4 3 2 1을 포함하는 목록 블록 []이 있고 자동으로 4 번째로 수행하고 3면으로 이동하고 더 이상 블록에 맞지 않을 때 멈추는 지 확인합니다. 두 번째 방법은 필자의 주요 기능에서 열과 행을 정의하는 것입니다. – steve

+0

죄송합니다. 필자는 제공된 기능을 제공하기 위해 bin 포장 문제에 대해서만 알고 있습니다. 실제로이 문제를 해결하는 것은 내 전문 기술을 뛰어 넘는 것입니다. :-) – Kevin