Algorithm 如何识别位图中的正方形?

Algorithm 如何识别位图中的正方形?,algorithm,Algorithm,我遇到了一个面试问题: 在布尔元素的nxn二维数组中,如何确定值是否形成正方形 例如: true true true true true false false true true false false true true true true true 形成一个正方形 我想我必须先检查中间是否有一个正方形(如果n是奇数总是真的),然后递归地检查周界的值。< /P> 这是最好的方法还是有更好更快的方法 一个标准可以由两点决定。假设左侧的顶部点(x1,y1),右侧的底部点(x2,y2)

我遇到了一个面试问题:

  • 在布尔元素的nxn二维数组中,如何确定值是否形成正方形
例如:

true true true true
true false false true 
true false false true 
true true true true
形成一个正方形

我想我必须先检查中间是否有一个正方形(如果n是奇数总是真的),然后递归地检查周界的值。< /P>

  • 这是最好的方法还是有更好更快的方法

一个标准可以由两点决定。假设左侧的顶部点
(x1,y1)
,右侧的底部点
(x2,y2)
。让我们将
1
用作
true
,将
0
用作
false

考虑一个数组:

array=[None]*5
数组[0]=[1,1,1,1,0]
数组[1]=[1,0,0,1,0]
数组[2]=[1,0,0,1,0]
数组[3]=[1,1,1,0]
数组[4]=[1,0,0,1,0]
显然,在这种情况下,
(0,0)(3,3)
形成一个正方形。我们可以找到一处房产:

当且仅当:

  • 通过将两行边框相加,您将得到一个
    2
    序列; 序列的长度等于到两行边框之间的距离。

  • 通过将两个列边框添加在一起,您将得到一个序列
    2
    ; 序列的长度等于到两列边框之间的距离。


利用上述属性,您将得到一个算法:

row_段=[]
col_段=[]
对于范围内的v1(透镜(阵列)):
对于范围内的v2(v1+1,透镜(阵列)):
对于范围内的列(len(array)),添加_row=[array[v1][col]+array[v2][col]
对于范围内的行(len(array)),添加_col=[array[row][v1]+array[row][v2]
行距离=v2-v1
行总和=总和(添加行[:行距离+1])
col\u sum=总和(加上col[:行距离+1])
对于范围内的i(透镜(阵列)-行距离):
j=i+行距离
如果行和=2*(行距离+1):
行\段.追加([v1,i,v2,j])
如果列和=2*(行距离+1):
列段追加([i,v1,j,v2])
行总和=行总和-如果j+1

让我们运行一些测试:

测试1:

0 0 0 0 0
0 0 1 1 1
0 0 1 0 1
0 0 1 1 1
0 0 0 0 0

Square (1, 2) (3, 4)  
测试2:

0 0 0 0 0
1 1 1 1 1
1 0 1 0 1
1 1 1 0 1
0 0 1 1 1

Square (1, 0) (3, 2)   
测试3:

0 0 0 0 0
1 1 1 1 1
1 0 1 0 1
1 1 1 1 1
0 0 0 0 0

Square (1, 0) (3, 2)
Square (1, 2) (3, 4)  
测试4:

1 1 1 1 1
1 0 1 0 1
1 1 0 0 1
1 0 0 1 0
1 1 1 1 1   

No squares found

就我个人而言,我会迭代数组并打印出0表示false,1表示true。然后看看结果,看看它是否是一个正方形…正方形是否总是正交定向(即,不旋转)?那就相对容易了。然而,如果正方形可以旋转,甚至可能没有像素对齐,那么这是相当困难的。更有趣的是,我从来没有想到它可以轮换,面试官没有说,但我相信他期待听到这个问题。对于旋转的、像素对齐的情况,是否有一种通用的方法?不清楚“形成正方形”是什么意思,即使在你的例子中也不清楚。您是否在寻找由
true
值组成的正方形轮廓,这些值至少包含一个
false
,并且可以位于位图中的任何位置?或者您只是在检查整个(方形)位图是否为
false
,位图的边框是否为
true
?(我假设正方形与位图边框对齐,并且没有旋转。)问题在于是否只有一个正方形而没有其他东西?还是网格中的某个正方形?或者网格中任何可能包含噪音的正方形?一个像素是正方形吗?从(0,0)到(4,3)如何明显地形成正方形?当然,它是矩形的轮廓,但只有当x2-x1==y2-y1
时,它才是正方形!我试图找到所有的矩形。“给我几分钟,”莫姆说。请再次检查。好的,您已经测试了您的代码,并提供了一个包含非方形矩形的测试用例,因此无需获得我的批准。我刚刚指出了您的第一个解决方案中的一个小错误。谢谢您的回答和评论。我最初的问题是为了找到一个完整的图形(而不是内部中空的正方形的周长)