Python 最大矩形算法

Python 最大矩形算法,python,algorithm,rectangles,Python,Algorithm,Rectangles,这是一个关于学校作业的问题。 我们必须使用一种算法来找到可能的最大矩形 在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 ll

这是一个关于学校作业的问题。 我们必须使用一种算法来找到可能的最大矩形 在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
资料来源:

例如:

000000
000000
000000
111000
111000
111000
这应该是18,确实如此。 如果我把它增加到6x10矩阵 我放置了一个3x3的子矩阵,里面有1 在最下面的角落,比那应该给我的 42,但只给我30

0000000000
0000000000
0000000000
1110000000
1110000000
1110000000

isFree()。for循环的运行次数不得超过一次;您总是点击
return True
return False

isFree()
有缺陷。for循环的运行次数不得超过一次;对于
isFree
,您总是点击
return True
return False

,在For循环的第一次迭代中,它将返回
True
False
,它将永远不会进入第二次迭代,因此它只会检查第一个单元格。(归功于,只是一个可能的澄清)

因此,
返回False
需要在循环之外

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

代码实际返回的矩形:

首先:

111000
111000
111000
第二项:

1110000000
1110000000
1110000000
因此,代码应该是这样的:(注意-我的Python有点生锈)


对于
isFree
,在For循环的第一次迭代中,它将返回
True
False
,它将永远不会进入第二次迭代,因此它将只检查第一个单元格。(归功于,只是一个可能的澄清)

因此,
返回False
需要在循环之外

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

代码实际返回的矩形:

首先:

111000
111000
111000
第二项:

1110000000
1110000000
1110000000
因此,代码应该是这样的:(注意-我的Python有点生锈)


离题:总是使用英语评论。“它似乎不起作用”对我们来说还不足以帮助你。到底出了什么问题?错误?不正确的输出?不正确的输出,我尝试了摆弄大小方法,但没有真正起作用。。。当有多个大小不同的块仍然可用时(现在更改我的注释),问题就出现了。您可能还需要提供一个小样本输入。添加的示例和带有problemOfftopic的输入:始终使用英语注释。“它似乎不起作用”对于我们来说还不足以帮助您。到底出了什么问题?错误?不正确的输出?不正确的输出,我尝试了摆弄大小方法,但没有真正起作用。。。当有多个大小不同的块仍然空闲(现在更改我的注释)时,问题就会出现。您可能还需要提供一个小样本输入。添加了示例和有问题的输入