用于查找N×N网格中的路径组合数的代码

时间:2014-05-29 21:05:38

标签: python

我必须编写一个代码,必须计算从N个N网格左上角开始的不同组合的数量,并在右下角结束。但我只能走下去吧!

所以基本上(如果我们给每个顶点一个1 - (N + 1)^ 2的数字),那么有多少个不同的组合来自1 - (N + 1)^ 2。但我只能加1或添加N + 1。

一个例子:2x2网格:

1 -- 2 -- 3
|    |    |
4 -- 5 -- 6
|    |    |
7 -- 8 -- 9

组合将是:

[1-2-3-6-9]
[1-2-5-6-9]
[1-2-5-8-9]
[1-4-5-6-9]
[1-4-5-8-9]
[1-4-7-8-9]

现在,我应该如何编写此代码?任何帮助将不胜感激!
提前致谢

1 个答案:

答案 0 :(得分:1)

阿。我看到你正在尝试其中一个EulerProject问题? 关键是要设法自己弄清楚并沿途学习新事物!你只是在欺骗自己。好吧

无论如何,考虑m行和n列的网格(我们不需要假设网格是正方形)。从左上角开始并从零开始计数,表示第i行和第j列中的交叉点/节点由N_(i,j)表示。

因此,左上节点是N_(0,0),左下角是N_(m,0),右下角是N_(m,n)。显然,从N_(0,0)到网格最右侧或最远顶部的任何节点的路径数量仅为1(因为我们可能只向下或向右)。

现在,考虑N_(1,1)有多少条路径。我们必须首先通过N_(0,1)或N_(1,0)。这只产生两条到N_(1,1)的路径。我们可以继续这个过程。为了确定到任何节点N_(i,j)的路径总数,我们只需要将路径总数加到N_(i,j-1)和N_(i-1,j)。在下图中以图形方式理解该过程,其中每个新整数表示节点的路径数。

enter image description here

如果我们在python中编码,我们得到:

def route_num(cube_size):
    L = [1] * cube_size
    for i in range(cube_size):
        for j in range(i):
            L[j] = L[j]+L[j-1]
        L[i] = 2 * L[i - 1]
    return L[cube_size - 1]

print route_num(20)会给我们137846528820。

来源:http://code.jasonbhill.com/