2013-10-23 2 views
0

0으로 만들어진 눈금을 인쇄하고 번호가 매겨진 특정 크기의 도형이 추가 된 CS1 용 프로젝트 작업. 형상을 추가하기 전에 A) 격자에 맞는지, B) 이미 다른 것이 있는지 확인해야합니다. 내가 겪고있는 문제는 도형 배치가 올바른지 확인하는 함수가 첫 번째 및 두 번째 도형을 항상 올바르게 수행하지만 이후에 추가 된 모든 도형은 찾고있을 때 추가 된 첫 번째 도형을 "보게"됩니다 충돌을 위해. 나는 그것이 처음 목록 이후에 올바른 목록을 찍는 것을 wasnt하는지 알기 위해 점검했다. 그러나 doesnt는 그것 인 것처럼 보인다. 문제의 예 ....Python 무시 목록에 무엇이 있습니까?

모양 크기 = 4, 3, 2, 1

파이썬 출력 :

4 4 4 4 1 2 3 0 
4 4 4 4 2 2 3 0 
4 4 4 4 3 3 3 0 
4 4 4 4 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 0 0 0 
0 0 0 0 0 0 0 0 

그것은 해야하는 출력 :

4 4 4 4 3 3 3 1 
4 4 4 4 3 3 3 0 
4 4 4 4 3 3 3 0 
4 4 4 4 2 2 0 0 
0 0 0 0 2 2 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 0 

여기에 무슨 일이 있습니까? 전체 코드 (r이 행 값이고 c는 열 값이다) 열린 공간을 테스트하는

def binCreate(size): 
    binlist = [[0 for col in range(size)] for row in range(size)] 
    return binlist 

def binPrint(lst): 
    for row in range(len(lst)): 
     for col in range(len(lst[row])): 
      print(lst[row][col], end = " ") 
     print() 

def itemCreate(fileName): 
    lst = [] 
    for i in open(fileName): 
     i = i.split() 
     lst = i 
    lst = [int(i) for i in lst] 
    return lst 

def main(): 
    size = int(input("Bin Size: ")) 
    fileName = str(input("Item Size File: ")) 
    binList = binCreate(size) 
    blockList = itemCreate(fileName) 
    blockList.sort(reverse = True) 
    binList = checker(binList, len(binList), blockList) 
    binPrint(binList) 

def isSpaceFree(binList, r, c, size): 
    if r + size > len(binList[0]): 
     return False 
    elif c + size > len(binList[0]): 
     return False 
    for row in range(r, r + size): 
     for col in range(c, c + size): 
      if binList[r][c] != 0: 
       return False 
      elif binList[r][c] == size: 
       return False 
    return True 

def checker(binList, gSize, blockList): 
    for i in blockList: 
     r = 0 
     c = 0 
     comp = False 
     while comp != True: 
      check = isSpaceFree(binList, r, c, i) 
      if check == True: 
       for x in range(c, c+ i): 
        for y in range(r, r+ i): 
         binList[x][y] = i 
       comp = True 
      else: 
       print(c) 
       print(r) 
       r += 1 
       if r > gSize: 
        r = 0 
        c += 1 
        if c > gSize: 
         print("Imcompadible") 
         comp = True 
     print(i) 
     binPrint(binList) 
     input() 
    return binList 
+0

입력 파일에는 무엇이 있습니까? 4 3 2 1? – octref

+0

입력 파일은 그 형식의 임의의 숫자입니다. 따라서 "4 1 1 1 5 6"과 "3 6 8 7 2 4 5"가 모두 작동하고 함께 연결하면 – BLU

+0

itemcreate는 의미가 없습니다. 반복적으로'lst = i'에게 무엇을 할 것으로 예상합니까? 그것이'lst'에 추가 될 예정인가요? 아니면 파일의 마지막 줄에만 관심이 있습니까? – user2357112

답변

1

귀하의 코드가 binList[r][c]에서 찾습니다 ... 다음과 같습니다. 그러나 열린 공간을 찾았 으면 값을 설정하는 코드는 binList[x][y] (여기서 x은 열 값이고 y은 행 값임)을 설정합니다.

후자가 잘못되었습니다. 대신 binList[y][x]을 설정하려고합니다 (행별로 색인화 한 다음 열).

그래도 실용적인 솔루션을 얻을 수는 있지만 그래도 기대하는 바를 정확히 나타내지는 않습니다 (대각선을 통해 반성을 얻습니다). 이는 r 코드가 먼저 업데이트되고 이 bin 크기를 초과 한 경우에만 c 코드가 업데이트되기 때문입니다. 먼저 오른쪽으로 항목을 배치하려면 아래에있는 항목을 교체해야합니다.

오히려 너무 while보다 rcfor 루프를 사용하는 것이 좋습니다 싶지만, 당신은 아마 당신 때문에 "하나 개의 항목의 장소를 찾아"코드를 감안해야 할 것 우아한 방식으로 작동하도록 return을 내부 루프에서 사용할 수 있습니다 (중첩 루프에서 벗어날 수 있도록 복잡한 코드가 필요하지 않음).

+0

옙 그게 다야, C와 R의 몇 가지를 플립 플립해야했고 그것은 매력처럼 일했다! 감사! – BLU