2013-10-22 88 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