n维中的组合 - 如何确定点是否相互看到(如果它们在同一轴上)

时间:2017-03-24 14:51:22

标签: c# algorithm combinations n-dimensional

在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轴,因此它们仅在某些情况下可以看到彼此

This image example explaining more than text i think

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;
}