在n维网格中(最大10 ^ 7维)是两点。它们在每个轴上都有假想的传感器。 我需要算法,当这两个点可以发现自己时,会计算所有可能的选项。
从我的任务文件中正式编写(翻译成英文):
设 A ,坐标为(a1,a2,...,an), B ,坐标为(b1,b2, ......,bn)
是n维空间中的两个点并且存在i∈1,2,...,n 使得 ai = bi 然后 A和B看到彼此
示例:
在 1维 空间 长度10 总计 45种组合 当他们看到对方时如何放置 2分 (他们每次都看到对方)。
容易组合10C2(10 of 2)= 45
如何按程序计算2,3,4,...,10 ^ 7维度(我更喜欢C#)?
正确的测试数据我有:
输入:
1
10个
输出:45
输入:
2
5 8
输出:220
输入:
3
8 12 11
输出:14784
更多解释:
输出是空间中的两个点彼此看到(在同一轴上)时的组合数。在一维空间中只有一个轴,所以他们总是看到彼此。在二维空间中是2轴,因此它们仅在某些情况下可以看到彼此
答案 0 :(得分:1)
我确定它是正确的。
C(x,y)是y的组合x
让我们说我们有一个维度,我们称之为长度为8的X.有C(8,2)= 8 * 7/2 = 28种可能性来看彼此。
当我们添加第二个维度,名为Y,现在长度为12时,我们有12条平行于X的线。所以我们在与X平行的所有线上找到12 * 28 = 336种可能性。现在,在Y维上我们有C( 12,2)= 66种可能性。并且有8条线,所以66 * 8 = 528
总计:336 + 528 = 846种可能性
现在让我们添加另一个维度,标记为Z,长度为11.在一行中有C(1,2)= 11 * 10/2 = 55,并且(注意)我们有8 * 12行。那么它是55 * 8 * 12 = 5280种可能性!
现在我们总共有:
Paralel到X轴:C(8,2)* 11 * 12 = 3696
平行于Y轴C(12,2)* 8 * 11 = 5808
平行于Z轴C(11,2)* 8 * 12 = 5280
总计= 14784
一般来说,n1,n2 ... nk长度的n维公式为:
C(ni,2)*(n1 * n2 ... * nk)/ ni的总和
或更短:
(n1 * n2 * n3 ... nk)/ 2 *(ni-1)的总和
例如:
尺寸与3,8,9,11:
(3 * 8 * 9 * 11)/ 2 *(3-1)= 2376
(3 * 8 * 9 * 11)/ 2 *(8-1)= 8316
(3 * 8 * 9 * 11)/ 2 *(9-1)= 9504
(3 * 8 * 9 * 11)/ 2 *(11-1)= 11880
总计= 32076
最简单的方法:
(n1 * n2 * n3 ... ni)(n1 + n2 + ... ni - k)/ 2,其中ni是lenghs,k是维数
答案 1 :(得分:0)
我已经创建了示例代码,您可以尝试一下。我检查它工作正常。
等式是:C(n,r)= n!/(r!(n-r)!)
示例:强> 1。 10C2 = 45 2。 10C3 = 120
public void Calc()
{
int result= nCr(10, 3);
}
public int nCr(int n,int r )
{
int nValue=1;
int rValue = 1;
for (int i = n-r+1; i <= n; i++)
{
nValue = nValue*i;
}
for (int i = 1; i <= r; i++)
{
rValue = rValue*i;
}
return nValue/rValue;
}