【问题标题】:Maximal rectangle algorithm最大矩形算法
【发布时间】:2013-05-07 02:15:38
【问题描述】:

这是一个关于学校作业的问题。 我们必须使用一种算法来找到可能的最大矩形 0 和 1 的矩阵中的 0 我选择了蛮力算法,因为问题只是一个小问题, 但它似乎不起作用。有什么帮助/想法吗?

'Determine greatest rectangle'
def determineBiggest(self):
    best_ll = [0,0]
    best_ur = [-1,-1]
    for llx in range(0,len(self.verkaveling)):
        for lly in range(0,len(self.verkaveling[0])):
            for urx in range(llx, len(self.verkaveling)):
                for ury in range(lly, len(self.verkaveling[0])):
                    if(self.grootte(llx,lly,urx,ury) > self.size(best_ll[0],best_ll[1],best_ur[0],best_ur[1])) and (self.isFree(llx,lly,urx,ury)):
                        best_ll[0]=llx
                        best_ll[1]=lly
                        best_ur[0]=urx
                        best_ur[1]=ury
    print self.size(best_ll[0],best_ll[1],best_ur[0],best_ur[1])                      
'Determine size of rectangle'                       
def grootte(self,a,b,c,d):
    if(a > c) or (b > d):
        return 0
    else:
        return (c-a+1)*(d-b+1)
'Check if rectangle is fully free'
def isFree(self,a,b,c,d):
    for x in range(a, c):
        for y in range(b, d):
            if self.verkaveling[x][y] == "0":
                return False
            else:
                return True

来源:used source

例子:

000000
000000
000000
111000
111000
111000

这应该给出 18 并且确实如此。 如果我将其增加到 6x10 矩阵 我放置了一个 1 的 3x3 子矩阵 左下角,比那应该给我 42,但只给我 30

0000000000
0000000000
0000000000
1110000000
1110000000
1110000000

【问题讨论】:

  • 离题:始终使用英文 cmets。
  • “它似乎不起作用”不足以让我们为您提供帮助。实际上出了什么问题?错误?输出不正确?
  • 输出不正确,我尝试摆弄 size 方法,但这并没有真正解决...现在)
  • 您可能还想提供一个小样本输入。
  • 添加示例和有问题的输入

标签: python algorithm rectangles


【解决方案1】:

isFree() 有问题。 for 循环永远不会运行超过一次;你总是点击return True 或return False。

【讨论】:

    【解决方案2】:

    对于isFree,在for循环的第一次迭代中,它将返回True或False,它永远不会进入第二次迭代,因此它只会检查第一个单元格。 (感谢Armin Rigo's answer,只是一个可能的澄清)

    所以,return False 需要在循环之外。

    另外,True 和 False 应该互换(因为当所有 0s 时它是免费的)。

    您的代码实际返回的是哪个矩形:

    对于第一个:

    111000
    111000
    111000
    

    第二个:

    1110000000
    1110000000
    1110000000
    

    所以,代码应该类似于:(注意 - 我的 Python 有点生疏)

    def isFree(self,a,b,c,d):
        for x in range(a, c):
            for y in range(b, d):
                if self.verkaveling[x][y] == "1":
                    return False
        return True
    

    【讨论】:

      猜你喜欢
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-05
      • 2013-03-05
      • 2015-02-08
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多