Если матрица квадратная (N x N
), я считаю, что число путей можно рассчитать следующим образом, где n = N - 1
:
from math import factorial
def number_of_paths(n):
return int(factorial(2 * n) / (factorial(n) ** 2))
А почему ... это немного сложнее. Прежде всего, вместо того, чтобы думать о движении вниз и вправо, давайте повернем матрицу на 45 градусов, чтобы мы всегда шли вниз, но выбираем влево или вправо.
Наша матрица теперь представляет собой алмаз, стоящий на его конце и образующий центр треугольника Паскаля . Это означает, что мы можем посмотреть на биномиальный коэффициент в центре нижнего ряда треугольника Паскаля, который в два раза больше нашей матрицы - 1.
Мы используем биномиальный коэффициент, потому что одна из его интерпретаций - это количество путей, которые мы можем выбрать, чтобы туда добраться.
Например, в случае 3 x 3
, 2 * 3 - 1 = 5
:
[1] C(0,0)
[1 1] C(1,0), C(1,1)
[1 2 1] C(2,0), C(2,1), C(2,2)
1 [3 3] 1 C(3,0), C(3,1), C(3,1), C(3,1)
1 4 [!6!] 4 1 C(4,0), C(4,1), C(4,2), C(4,3), C(4,4)
Answer is 6! Answer is C(4, 2)!
Ответ оказывается (2n)! / n! ** 2
(вывод ниже), который мы можем вычислить напрямую.
Вы также можете обобщить на неквадратные матрицы, перемещая элемент в нижнем ряду, который вас интересует, и в этот момент вы в итоге просто набираете C(n, k)
. Надеюсь, понятно почему.
Только математика!
Из приведенной выше диаграммы видно, что первые три значения для N:
N | Value
- + -------
1 | C(0, 0)
2 | C(2, 1)
3 | C(4, 2)
Таким образом, мы видим, что ответ:
= C(2(N - 1), N - 1)
let n = N-1
Given C(a, b) = a! / b!(a - b)!
= C(2n, n)
= (2n)! / n!(2n - n)!
= (2n)! / n! ** 2
Геометрическая интерпретация длины пути
Представьте себе матрицу 4x4
, чтобы попытаться понять, почему длина составляет 2(N-1)
. Сначала несколько замечаний:
- Все длины пути идентичны
- Поэтому мы можем рассмотреть любой конкретный путь для проверки длины для всех
- Поэтому давайте рассмотрим путь от:
- Сверху слева на верх справа (все идет направо)
- Затем сверху справа внизу справа (все вниз)
Для начала мы начнем с левого верхнего угла, где не было сделано никаких шагов, и продвигаемся вдоль верхней стороны:
0 - - - 0 1 - - 0 1 2 - 0 1 2 3
- - - - > - - - - > - - - - > - - - -
- - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - -
После 3 ходов мы пересекли длину 4 стороны. Таким образом, для стороны длины N
требуется N-1
перемещения для перемещения. То же самое верно для вертикали, нам понадобится еще N-1
ходов для перемещения сверху вниз:
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
- - - - > - - - 4 > - - - 4 > - - - 4
- - - - - - - - - - - 5 - - - 5
- - - - - - - - - - - - - - - 6
Следовательно, общая длина пути составляет 2(N-1)