2D平面与平面原点之间的不同路径数

时间:2013-08-14 20:07:28

标签: algorithm math geometry 2d polynomial-math

假设,我处于2D平面的原点。我希望通过完全N 步骤来达到点(x,y)。

如果我当前在点(p,q)那么,我可以去点(p + 1,q),(p,q + 1),(p-1,q),(p,q-) 1)一步之后。

我可以用多少种不同的路线来做到这一点?请注意: N最多为1000万

1 个答案:

答案 0 :(得分:0)

这里的新答案: 在分析计算表之后 - 可以找到具有一些组合的路径数。

德尔福代码(请注意,长期算术应该用于Int64范围之外的大数字):

function PathCount(x, y, N: Integer): Int64;
var
  t, Diff: Integer;
begin
  x := Abs(x); //exploit symmetry
  y := Abs(y);

  if y > x then begin  //Swap them for simplicity, exploit symmetry again
    t := x;
    x := y;
    y := t;
  end;

  Diff := N - (x + y);
  if (Diff < 0) or Odd(Diff) then
    Exit(0);  //return 0 for unavailable points

  Diff := Diff div 2;
  Result := CombinationCount(N, x + Diff) * CombinationCount(N, Diff);
end;


function CombinationCount(n, k: Integer): Int64;
var
  i: Integer;
begin
  Result := 1;
  if k > n - k then
    k := n - k;
  for i := 1 to k do
    Result := (Result * (n - i + 1)) div i;
end;

旧答案(用于演示)

对于合理的N,可以使用动态编程。使3d数组具有限制(-N / 2..N / 2),( - N / 2..N / 2),(0..N)。请记住它的大小是N ^ 3(对于1000万点来说是10 ^ 21,不切实际)。您可以利用对称性,但减少因子只是小常数(2或4)。

递归公式:

P(p, q, K) = P(p-1, q, K-1) + P(p+1, q, K-1) + P(p, q-1, K-1) + P(p, q+1, K-1)

逐层填充数组:在第一步使P(x-1,y0,1)= 1(并且多3点),依此类推...... 0,1和2步后的初始点邻域:

                  0 0 1 0 0
0 0 0    0 1 0   0 2 0 2 0
0 1 0    1 0 1   1 0 4 0 1
0 0 0    0 1 0   0 2 0 2 0
                  0 0 1 0 0 

动画的6个步骤:

enter image description here

完成后,P(0,0,N)将包含多个路径。

P.S。可能有一些组合公式。例如,我们可以看到最后对角线中的二项式系数C(N,K)(1 1 1 1 1 3 3 1,1 4 6 1 1 ...),下一个非零对角线包含N * C(N, K)等等。