2013-10-22 139 views
2

我遇到了以下問題。我的主要功能是讀取一些數據,如1 2 3 4,並創建一個下降整數的列表4 3 2 1。它還讀入一個整數,以設置一個bin,其大小爲的bin x bin平方。二進制二維尺寸和包裝

然後它確定邊界是否正常。在此之後,我遇到了包裝功能問題。我的代碼...

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

def packing(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 

要添加到更清楚,我的功能應該採取在bin值,例如6並作出6x6電網0的。

000000 
000000 
000000 
000000 
000000 
000000 

下一步將採取的列表,如4 3 2 1和創造的4x4 3x3的2x2的廣告和1x1塊。例如,我創建了一個5x5的bin網格。如果我把它4321會是什麼樣子:

44441 
44440 
44440 
44440 
00000 

由於它不適合3和2將到1,並開始從頂部0。 同樣,我的代碼應該打印出未使用的0和塊的數量。因此,它不需要使用最佳解決方案,只需從給定的一組塊中按順序進行即可。

所以當輸入文件block.txt。它以降序從文件中創建一個整數列表。塊= [4,2,1]。如果我的箱子= 5 它會創建一個像

00000 
00000 
00000 
00000 
00000 

網格現在,當4被放置。 4塊意味着它是一個4x4塊。由於0代表開放點,因此將首先放置4x4。

44440 
44440 
44440 
44440 
44440 

現在它會嘗試在打開的0中放置一個2×2塊。然而,這個塊沒有開放的位置,所以它會進入1.因爲右上角(0)的位置是開放的,它會將它放在那裏。

44441 
44440 
44440 
44440 
44440 
+0

什麼是'bin'價值?建議您先從問題開始,並在最後發佈整個代碼。請提供一個簡短的自包含的可編譯示例,說明發生了什麼問題,而不是整個項目中的每一行代碼。 http://sscce.org/ – UpAndAdam

+0

我已更新它。 BIN基本上是一個網格。例如,如果我將5作爲BIN,它將創建一個5x5的零網格。邊界將是5.如果行+塊> 5,那麼它不應該放置任何東西並返回False。 – user2908101

+0

我遇到的代碼部分是打包函數,我實際上將列表塊中的值放入。所以如果我的block = [4,3,2,1]它會以一個4x4塊開始並放入,然後它會檢查它是否可以放置一個3x3,2x3和1x1。如果它不能放置一個3x3和一個2x2,它會告訴我,2和3不能放置,剩下零的數量。 – user2908101

回答

0

問題出在isSpaceFree的開頭。無條件地返回false。後來從if bin[row][column] == 0: return True

不需要的檢查會發生同樣的問題去掉他們,你是好

def isSpaceFree(bin, row, column, block): 
    if row + block > len(bin): 
     return False 
    if column + block > len(bin): 
     return False 
    else: # YOU PROBABLY DON'T WANT THIS HERE 
     return False #DITTO 

    ## Nothing from here or below ever gets reached because of above commented lines 
    if bin[row][column] == 0 : ## you dont want this 
     return True ##because this is bad too and aborts and its already covered below 
    for r in range(row, row+block): 
     for c in range(column, column + block): 
      if bin[r][c] != 0: 
       return False 
    return True