Это похоже на треугольник Pascal. Чтобы добраться до каждой точки на сетке, требуется сумма путей по позициям выше и влево до главной диагонали (прогрессия Pascal), а затем вниз до места назначения.
2x2
Pascal's Rest
*--1--1 *--1--1
| | | | | |
1--2--+ 1--2--3
| | | | | |
1--+--+ 1--3--6 ==> 6 paths
3x3
Pascal's Rest
*--1--1--1 *--1--1--1
| | | | | | | |
1--2--3--+ 1--2--3--4
| | | | | | | |
1--3--+--+ 1--3--6--10
| | | | | | | |
1--+--+--+ 1--4--10-20 ==> 20 paths
4x4
Pascal's rest
*--1--1--1--1 *--1--1--1--1
| | | | | | | | | |
1--2--3--4--+ 1--2--3--4--5
| | | | | | | | | |
1--3--6--+--+ 1--3--6--10-15
| | | | | | | | | |
1--4--+--+--+ 1--4--10-20-35
| | | | | | | | | |
1--+--+--+--+ 1--5--15-35-70 ==> 70 paths
На этом этапе вы можете сделать больше математики или реализовать эффективный алгоритм для вычисления результата:
N = 4
paths = [1]
for _ in range(N):
paths = [ a+b for a,b in zip(paths,[0]+paths) ]+[1] # Pascal's
for _ in range(N):
paths = [ a+b for a,b in zip(paths,paths[1:]) ] # Rest
result = paths[0]
More Math : если вы расширите квадрат до 2N, вы также заметите, что результатом является точка, находящаяся точно посередине основной диагональ. Это N-е значение в строке 2N треугольника Pascal.
*--1--1--1--1··1··1··1··1
| | | | | : : :
1--2--3--4--5··+··+··8··
| | | | | : :
1--3--6--10-15·+··28··
| | | | | :
1--4--10-20-35·56··
| | | | |
1--5--15-35-70·· <-- 70 is combinations of 4 in 8
: : : :
1··+··+··56··
: : :
1··+··28··
: :
1··8··
:
1··
В соответствии со свойствами треугольника Pascal, это эквивалентно количеству комбинаций значений N в наборе 2N.
Может быть рассчитано как ( 2н)! / N! ^ 2: factorial(2*N)//factorial(N)**2
N=2 --> 4!/2!^2 --> 24/4 --> 6
N=3 --> 6!/3!^2 --> 720/36 --> 20
N=4 --> 8!/4!^2 --> 40320/576 --> 70
...
N=20 --> you do the math :)