我必须编写一个代码,必须计算从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]
现在,我应该如何编写此代码?任何帮助将不胜感激!
提前致谢
答案 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)。在下图中以图形方式理解该过程,其中每个新整数表示节点的路径数。
如果我们在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。