0

我正在尝试找到 euler-problem n°15 的解决方案。 http://projecteuler.net/problem=15 (查找从网格左上角到右下角的路径数)。

第一次尝试没有成功,因为我将所有可能的组合都存储在 List 中,我最终遇到了堆问题(可以预测,不是吗)。

在第二次尝试中,我决定计算网格中每个点存在多少种可能的方式。例如(0,0)有一个唯一的访问方式,(1,1)有两个(通过(0,1)和另一个通过(1,0))。对于每一点,我们总结了前两点的可能方式。由于这似乎是一个很好的解决方案,没有太多的内存问题,我仍然没有得到正确的答案,你能告诉我我的错误的根源吗(因为我假设我犯了一个错误,而不是他们显然)。

抓拍的源代码:

    @Test
public void testFoo() {
    long[][] grid = new long[20][20];
    for(int i=0; i<20; i++){
        grid[0][i]=1;
        grid[i][0] =1;
    }
    int steps=1;
    while(steps<21){
        for(int i=steps; i<20; i++){
            grid[i][steps]= grid[i-1][steps]+grid[i][steps-1];
            grid[steps][i]= grid[i-1][steps]+grid[i][steps-1];
        }
        steps++;
    }
    System.out.println(grid[19][19]); //35345263800
}
4

1 回答 1

3

2 × 2网格中,有3 × 3交叉点,所以你需要一个3 × 3数组。

  0 1 2
0 ┌─┬─┐
1 ├─┼─┤
2 └─┴─┘

所以对于一个20 × 20网格,你需要一个21 × 21数组。


另一种解决方案:在数学中使用组合,答案是组合 40 20

于 2013-08-14T12:51:10.957 回答