假设我有一个2d的对象数组,N×N。假设一对可以由每对相邻的对象组成,水平,垂直或对角。如何计算N的任何值唯一对的数量?
例如,对于N = 2
0 1
2 3
您可以获得01 02 03 21 23 31,请注意03与30
相同是否有一个公式来确定给定N中有多少对,甚至更好的算法来生成这些?
语言并不重要,但我将使用c ++。
使用以下算法并消除重复索引,我得到以下计数。不确定公式是什么。
For size N=2
Unique pairs is =6
For size N=3
Unique pairs is =20
For size N=4
Unique pairs is =42
For size N=5
Unique pairs is =72
For size N=6
Unique pairs is =110
For size N=7
Unique pairs is =156
For size N=8
Unique pairs is =210
For size N=9
Unique pairs is =272
有趣的是,公式似乎是2 ^ 2 + 2,4 ^ 2 + 4,6 ^ 2 + 6,8 ^ 2 + 8 ...
答案 0 :(得分:1)
我发现最容易选择每种类型对的代表性对象(换句话说,垂直对的顶部对象,水平对的最左边的对象,并选择对角线对)。这会产生n(n-1)
个垂直对,n(n-1)
个水平对和2(n-1)^2
个对角线对(每个变量的等量)。总计2(n-1)(n+n-1)=2(n-1)(2n-1)
,与您的猜测一致。
答案 1 :(得分:1)
每行有n-1个行内对,有n行。
每列有n-1个列内对,有n列。
每对相邻的行具有2 *(n-1)个对角线对,并且存在(n-1)个相邻的行对。
将这些数字相乘并添加,您将得到解决方案。
答案 2 :(得分:0)
这是计算唯一对的固定公式。
(4 C 2)*(N-1)^2 - 2*(N-2)*(N-1)
基本上你只需在dasblinkenlight的答案中使用该方法并减去“重复”边缘。重复边缘将始终是象限之间的边缘。我已经为下面的重复计数添加了一个解释。
对于N>使用原始公式(4 C 2)*(N-1)** 2。 2,你会计算重复数。你想要做的是从计算中减去这些重复的边缘。
让我们来研究N>的最简单的情况。 2.假设N = 3。
0-1-2
|x*x|
3*4*5
|x*x|
6-7-8
查看我标有星号而不是边缘的地方?公式将对这些边缘计数两次。我们可以通过将它们分解为水平和垂直边缘来计算它们。两次计算的垂直边数将为(N-2)*(N-1)
。
在N = 3的情况下,这将是1 * 2 = 2
。两次计算的水平边数也将为(N-2)*(N-1)
。
因此,如果我们简单地将重复的垂直边数和重复的水平边加起来,我们得到
(N-2)*(N-1) + (N-2)*(N-1) = 2*(N-2)*(N-1)
我们可以简单地从总数中减去该数字,以获得正确的边数。
Python中的测试计数:
from math import factorial
def choose(n, k):
return factorial(n)/(factorial(k) * factorial(n-k))
for N in range(2, 10):
print choose(4, 2) * (N-1)**2 - 2 * (N-2) * (N-1)
程序打印:
6
20
42
72
110
156
210
272