如何解决计算网格中的正方形
我有一个场景,其中有一个带有点的网格。例如,在下面的m X n(即5 X 6)网格的情况下,假设左上角是0,0(第一行,第一列)。点(1,1),(1,3),(1,4),(2,3),(2,4),(3,1)丢失了。
我需要找到平方数。正方形的每一边都应填充点。因此,答案下面将是4(还包括外部大方块)。所以我的问题是 A)代表此问题的输入的最佳方法是什么? B)找到平方的算法是什么。
方格可以包含在另一个方格中。所有平方都必须计算。
......
. . .
... .
. ....
......
以下是我到目前为止的逻辑。 i / p是一个由1和0组成的2D数组(1是点,0是间隙)。
set count=0
loop i =0 to m //each row
loop j = 0 to n //each colum
ifSquareFormedAt(i,j)
count++
func ifSquareFormedAt(i,j){
???? //what will be the logic here?
}
解决方法
复杂度为O(n^3)
的简单算法,其中n
是矩形大小:
按行和列计算累加和,因此R[i][j]
包含从左到第j个索引在第i行中的个数,C[i][j]
包含在第j列中的个数从顶部到第i个索引。
现在遍历大小为k>1
且在[i][j]
处左上角的所有可能的正方形
获取行差异并将其与k进行比较,对列差异进行相同操作
for all nonzero i,j:
for k=1..min(width-j,height-i):
if nonzero(i+k,j+k):
if R[i][j+k] - R[i][j] != k //top row difference
break //there are holes in this row between i and i+k
if C[i+k][j] - C[i][j] != k //left column difference
break
if R[i+k][j+k] - R[i+k][j] != k //bottom row difference
break //there are holes in this row between i and i+k
if C[i+k][j+k] - C[i][j+l] != k //right column difference
break
count +=1 //we reached this point,so all sides are good
Python代码5的结果6(外部矩形不是正方形)
def nonzero(a,y,x):
return 1 if a[y][x]=='.' else 0
w = 6
h = 5
a = ['......','. . .','... .','. ....','......']
r = [[0]*w for i in range(h)]
c = [[0]*w for i in range(h)]
for i in range(h):
for j in range(w):
val = nonzero(a,i,j)
if i==0:
c[i][j] = val
else:
c[i][j] = c[i-1][j] + val
if j==0:
r[i][j] = val
else:
r[i][j] = r[i][j-1] + val
count = 0
for i in range(h - 1):
for j in range(w - 1):
if nonzero(a,j):
for k in range(1,min(h-i,w-j)):
if nonzero(a,i+k,j+k):
if r[i][j+k] - r[i][j] != k :
break #there are holes in this row between i and i+k
if c[i+k][j] - c[i][j] != k:
break
if r[i+k][j+k] - r[i+k][j] != k:
break
if c[i+k][j+k] - c[i][j+k] != k:
break
count += 1
print(i,j,k)
print(count)
0 0 2
0 2 3
2 0 2
3 2 1
3 3 1
3 4 1
6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。