这是关于学校作业的问题。 我们不得不使用算法来找到最大的矩形 在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矩阵 然后我放置一个1x3的3x3子矩阵 左下角,应该给我 42,但只给我30
0000000000
0000000000
0000000000
1110000000
1110000000
1110000000
答案 0 :(得分:3)
isFree()
是错误的。 for循环永远不会运行多次;您总是点击return True
或return False
。
答案 1 :(得分:1)
对于isFree
,在for循环的第一次迭代中,它将返回True
或False
,它将永远不会进入第二次迭代,因此它将永远检查第一个单元格。 (信用Armin Rigo's answer,只是可能的澄清)
因此,return False
需要在循环之外。
此外,True
和False
应该互换(因为当所有0
s 时, )。
您的代码实际返回的矩形:
第一个:
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