查找表中的路径数

时间:2015-04-11 09:16:12

标签: algorithm combinations

Tere是一张大小为R×C的表格; R行和C列。 该表的子矩形被阻止。 我们只能向右或向下移动。在没有通过被阻挡的子矩形的情况下,从左上角单元到右下角单元的路径数是多少?

我的方法: 计算行r2 C = {0到c1-1}的路径和行r1的路径C = {c2 + 1,C}

 r1,c1,r2和c2,阻塞矩形的左上角单元格和右下角单元格。

Cal Calculate C(n,k)

我的代码:

int R = in.nextInt()-1;
int C = in.nextInt()-1;
int r1 = in.nextInt()-1;
int c1= in.nextInt()-1;
int r2 = in.nextInt()-1;
int c2 = in.nextInt()-1;
long ans=0;
long temp=0;
temp+= Cal(R-r2+C-c1,C-c1);
for(int i=0;i<c1 && r2!=R;i++){
    ans+=Cal(i+r2,r2)*(Cal(R-r2+C-i,C-i)-temp);
}
temp=0;

temp+=Cal(r1+c2,r1);

for(int i=c2+1;i<=C;i++){
ans+= (Cal(i+r1,r1)-temp)*Cal(C-i+R-r1,C-i);

}
System.out.println(ans);

我没有得到上述算法的正确答案。如果我做错了事,请帮帮我。

Sample input:
8 12
5 5 8 8    ANS:7008

2 个答案:

答案 0 :(得分:1)

我建议采用动态编程方法来解决这个问题。每个&#34;解锁&#34;董事会中的单元格将有一个与之关联的数字,右下方的数量;目前这个数字在每个单元格中都是未定义的。

最好用一个例子解释一下。假设我们有

OOOOOO
OXXOOO
OXXOOO
OOOOOO
OOOOOO

作为我们的董事会,其中X代表障碍,O是一个正方形,我们还没有填充右下角的路径数。我们现在从右下角向后工作。我们首先填写右下角的数字1,尽管这可能没有多大意义。

OOOOOO
OXXOOO
OXXOOO
OOOOOO
OOOOO1

现在可以填写最靠近右下角的两个方格。它们很容易。

OOOOOO
OXXOOO
OXXOOO
OOOOO1
OOOO11

现在我们可以填写3个方块:

OOOOOO
OXXOOO
OXXOO1
OOOO21
OOO111

在每种情况下,我们正在做的只是将正方形右边的数字和正方形下面的数字加在一起,我们可以想象零偏离板的右侧和底部。下一步:

OOOOOO
OXXOO1
OXXO31
OOO321
OO1111

到目前为止,我们已经获得了二项式系数,这是我们在这样的问题中所期望的。下一步:

OOOOO1
OXXO41
OXX631
OO4321
O11111

更多二项式系数。下一步:

OOOO51
OXXA41
OXX631
O54321
111111

我使用字母A代表10.它就像二项式系数一样,但是我们在电路板上丢失了一些。然而,很快就会发生变化。下一步:

OOOF51
OXXA41
OXX631
654321
111111

注意使用F代替15.现在事情变得有趣了。由于我们无法通过障碍物,因此我们将0与障碍物中的细胞相关联。要填写右上角的空白,我们添加F + 0 = F.类似地,0 + 6 = 6。

OOFF51
OXXA41
6XX631
654321
111111

下一步:

OFFF51
6XXA41
6XX631
654321
111111

最后一步:

UFFF51
6XXA41
6XX631
654321
111111

我在这里使用U代表21 = F + 6.这就是问题的答案。

该程序一般有效。我们可以在右侧和下方填写我们知道数字的任何单元格,然后逐渐填写整个矩形。

答案 1 :(得分:0)

我发现很难理解算法的描述,因此我不确定如何帮助解决这个问题。但是,我认为找到路径数量的一种方法是从总可能路径中减去包含子矩形中的单元格的路径。

包含特定单元格的路径数等于从左上角到该单元格的路径数,再乘以从该单元格到右下角的路径数。由于您只能向下或向右移动,因此考虑子矩形的左列和顶行足以说明所有这些。

如果您从子矩形的左上角开始,则可以按照以下示例进行操作(ABCDEF构成子矩形):

start   X     X     X     X
  X     A     B     C     X
  X     D     E     F     X
  X     X     X     X    end

The sum of paths that include A,B,C,D,E or F equals:
   Paths to A * Paths from A to end = 2 choose 1 * 5 choose 2                   = 20
 + (Paths to cell above B) * Paths from B to end = 1 * 4 choose 2               = 6
 + (Paths to cell above C) * Paths from C to end = 1 * 3 choose 1               = 3
 + (Paths to cell left of D) * Paths from D to end = 1 * 4 choose 1             = 4

Solution equals: total paths - the number of paths that include A,B,C,D,E or F 
= 7 choose 3 - (20 + 6 + 3 + 4)                                                 = 2

JavaScript代码:

function f(Rows,Cols,r1,c1,r2,c2){
  var r = Rows - r1,
      total = C(Rows + Cols - 2,Rows - 1),
      s = C(r1 + c1 - 2,r1 - 1) * C(Cols - c1 + r,r);

  if (c2 > c1 && r1 > 1){
    for (var i=c1+1; i<=c2; i++){
      s += C(i + r1 - 3,i - 1) * C(Cols - i + r,r);
    }
  }

  if (r2 > r1 && c1 > 1){
    for (var i=r1+1; i<=r2; i++){
      s += C(i + c1 - 3,i - 1) * C(Rows - i + Cols - c1,Rows - i);
    }
  }

  return total - s;
}

function C(n,k){if(k==0||n==k)return 1;var p=n;for(var i=2;i<=k;i++)p*=(n+1-i)/i;return p}

输出:

console.log(f(4,5,2,2,3,4));
2

console.log(f(5,6,2,2,3,3));
21

console.log(f(8,12,5,5,8,8));
7008