import numpy as np
import matplotlib.pyplot as plt
m1 = np.array([[1,0,0,0,1,1,0,1,1,1,],
[0,0,0,1,1,0,0,0,0,1,],
[1,0,1,0,1,1,1,1,0,0,],
[1,0,0,1,1,0,0,0,0,1,],
[1,1,0,1,0,0,1,1,1,0,],
[1,1,1,1,0,1,1,0,0,0,],
[1,1,0,1,0,1,1,0,1,1,],
[1,1,0,0,0,1,1,1,0,0,],
[1,1,1,1,1,0,1,0,0,1,],
[0,1,0,1,0,1,0,1,0,1,]])
class Solution:
def maximalRectangle(self, matrix):
n = len(matrix)
if n == 0:
return 0
m = len(matrix[0])
h = [0] * (m+1)
self.ans = 0
for i in range(n):
for j in range(m):
if matrix[i][j] == '1':
h[j] += 1
else:
h[j] = 0
self.ans = self.robot(self.ans,h)
return self.ans
def robot(self,maxL,h):
stk = []
m = len(h) - 1
i = 0
while i <= m:
if len(stk) == 0 or h[stk[-1]] < h[i]:
stk.append(i)
i += 1
else:
now_idx = stk.pop()
if len(stk) == 0:
maxL = max(maxL,i * h[now_idx])
else:
maxL = max(maxL,(i - stk[-1] - 1) * h[now_idx])
return maxL
def oversetother(a,b,m):
list_number = []
H = b[1]
I = b[0]
i = a[0]
j = a[1]
for k in range(i,I+1):
for p in range(j,H+1):
list_number.append(m[k][p])
if 0 in list_number:
return False
else:
return len(list_number)
def rectangle(m):
m_long = len(m)
m_wide = len(m[0])
dict_area = {}
for i in range(m_long):
for j in range(m_wide):
if m[i][j] == 0:
continue
for I in range(m_long):
for H in range(m_wide):
if m[I][H] == 0:
continue
elif I==i:
continue
elif H==j:
continue
a = (i,j)
b = (I,H)
if oversetother(a,b,m) == False:
continue
else:
dict_area[(i,j,I,H)] = oversetother(a,b,m)
return sorted(dict_area.items(),key = lambda item:item[1],reverse=True)[0]
def overset(a,b,n,m):
list_number_1 = []
list_number = []
H = b[1]
I = b[0]
i = a[0]
j = a[1]
if I==i:
return False
interval = (H-j)/(I-i)
if interval<1 and interval>-1:
return False
elif interval == 1 or interval == -1 or interval == 0:
new_interval = (H-j)//(I-i)
c = j
for k in range(i,I+1):
for p in range(c,c+n):
list_number_1.append((k,p))
c = c + new_interval
else:
return False
for z in list_number_1:
y =z[1]
if y>10:
return False
elif y<0:
return False
else:
pass
for u in list_number_1:
x = u[0]
y = u[1]
list_number.append(m[x][y])
if 0 in list_number:
return False
else:
return len(list_number)
def parallelogram(m):
list_size = {}
m_long = len(m)
m_wide = len(m)
for i in range(m_long):
for j in range(m_wide):
if m[i][j] == 0:
continue
for I in range(m_long):
for H in range(m_wide):
if m[I][H] == 0:
continue
else:
for q in range(2,m_wide-max(H,j)+1):
a = (i,j)
b = (I,H)
if overset(a,b,q,m) == False:
continue
else:
list_size[(i,j,I,H,q)] = overset(a,b,q,m)
return sorted(list_size.items(),key = lambda item:item[1],reverse=True)[0]
#主函数,main()参数为矩阵m1
def main(m):
a1 = rectangle(m)[1]
a2 = parallelogram(m)[1]
result = max(a1,a2)
print("The largest parallelogram with horizontal sides has a size of:",end="")
print(result)
main(m1)