在数组中,如何知道选定的索引可以创建矩形还是方形



我有一个这样的数组:

array = [
0, 1, 2, 3,
4, 5, 6, 7,
8, 9, 10, 11,
12, 13, 14, 15
];

输入如下:

input = [5,6,9,10]

当我们将这个输入与数组进行比较时,我们可以看到这个输入实际上在数组上创建了一个正方形。

input = [6,9,10]

这个,在连续的,创建了一个三角形。

我想写一个函数,检查给定的输入是否创建了矩形或正方形。如果是,则返回true,否则返回false。如何编写该函数?

您需要预先确定源数组是正方形还是矩形。

即使阵列不是W=4和H=4的正方形,而是,内部表示也是相同的

[ 0, 1,  2,  3,  4,  5,  6,  7,
8, 9, 10, 11, 12, 13, 14, 15 ];

其是具有W=8、H=2的矩形。

你可以看到,如果W=4,(5,6,9,10(会变成一个正方形,但如果W=8,则不会变成任何正方形。

假设你知道数组的宽度W(因此知道它的高度H,它是数组的大小除以W(,那么如果你有一个元素N,比如5,它在WH系统中的二维坐标是

{ 
x: N % W, 
y: floor(N / W)
}

所以你看到N=5变成了(1,1(。一旦你有了所有元素的二维坐标,检查形状就很简单了。

正方形和矩形:您有四个元素,(x1,y1(、(x2,y2(,(x3,y3(,(x4,y4(。如果x1=x3,y1=y2,x2=x4,y3=y4,则它是一个正方形或矩形,方向与数组类似。如果x2-x1等于y3-y1,则它是一个正方形;否则为矩形。

您可以添加更复杂的条件来检查其他安排。例如,1-2边是(x2-x1((x2-xl(+(y2-y1((y2-y1(的平方根。对于1-3和2-4对角线以及所有其他边也可以这样做。如果对角线的长度相等,则它是一个矩形(或正方形(。另外,如果1-2和2-3边相等,那么它就是一个正方形。无论正方形的方向如何(即,(2,6,8,10(将被识别为正方形(,这种更复杂的条件都有效。

三个点总是一个三角形,除非三条边中的两条边的和恰好等于第三条边(这是一个退化三角形(。如果一条边的长度的平方等于另两条边的平方和,则得到一个直角三角形。检查等腰和等边是很简单的。

如果你不知道W,那么你需要分解数组的大小S,并尝试所有的可能性。16是2*2*2*2,因此需要检查W=2、W=4、W=8和W=16。

假设矩形必须轴对齐,并且输入是有序的,那么如果(4096*a + 256*b + 16*d + c) % 17 = 0,则[a, b, c, d]形成矩形。

这仅适用于从0到15的值的这种特定排列。如果有25个类似排列的值(0-24(,则可以使用(15625*a + 625*b + 25*d + c) % 26 = 0。这种模式是可推广的。

您可以通过定义两个方法isRectangleisTriangle并调用来检查给定的输入是矩形还是三角形

return isTriangle(input) OR is Rectangle(input)

带有

isRectangle(input):
return length(input) == 4 AND input[0] < input [1] < input[2] < input [3]

isTriangle(input):
return length(input) == 3 AND input[0] < input [1] < input[2]

最新更新