Условие
Перед вами шахматная доска размером N × N. В верхнем левом углу находится шашка. Шашка может двигаться только вправо или вниз (вверх или влево двигаться нельзя). Сколькими различными путями шашка может прийти в нижний правый угол?
Решение
Шаг 1. Формализуем переходы
Доска N × N — это сетка из N строк и N столбцов клеток. Чтобы из верхнего левого угла попасть в нижний правый, шашке нужно сделать ровно:
N − 1ходов вниз (D),N − 1ходов вправо (R).
Всего 2(N − 1) ходов. Каждый путь — это последовательность из N − 1 буквы D и N − 1 буквы R в произвольном порядке.
Шаг 2. Считаем размещения
Число различных путей = число способов выбрать, в каких из 2(N − 1) позиций будут стоять, скажем, ходы вниз:
C(2(N − 1), N − 1) = (2(N − 1))! / ((N − 1)! · (N − 1)!)
Шаг 3. Малые значения для проверки
| N | Формула | Число путей |
|---|---|---|
| 1 | C(0, 0) |
1 |
| 2 | C(2, 1) |
2 |
| 3 | C(4, 2) |
6 |
| 4 | C(6, 3) |
20 |
| 5 | C(8, 4) |
70 |
| 8 (шахматы) | C(14, 7) |
3432 |
Для классической шахматной доски 8 × 8 ответ — 3432 пути.
Шаг 4. Альтернативный вывод через DP
Можно посчитать рекурсивно: paths(i, j) = paths(i − 1, j) + paths(i, j − 1), где paths(0, j) = paths(i, 0) = 1. Это треугольник Паскаля, повёрнутый на 45° — значение в клетке (N − 1, N − 1) равно C(2(N − 1), N − 1).
from math import comb
def paths(N):
return comb(2 * (N - 1), N - 1)
# DP-проверка
def paths_dp(N):
dp = [[1] * N for _ in range(N)]
for i in range(1, N):
for j in range(1, N):
dp[i][j] = dp[i-1][j] + dp[i][j-1]
return dp[N-1][N-1]
for N in [1, 2, 3, 4, 5, 8]:
print(N, paths(N), paths_dp(N))
# 1 1 1
# 2 2 2
# 3 6 6
# 4 20 20
# 5 70 70
# 8 3432 3432Шаг 5. Сложность
- Через формулу:
O(N)на одно вычисление факториала / биномиального коэффициента. - Через DP:
O(N²)времени иO(N)памяти (если хранить только текущую строку).
Подводные камни
- Путаница «доска N×N» — это N клеток или N линий? Если
N— число клеток, то ходов всего2(N − 1). Если в задаче было бы «сеткаN × Nузлов», то ходов было бы2N. Здесь — клетки. - Сторона
N≠ число «сделанных ходов». Частая ошибка — записатьC(2N, N). Это неверно для доскиN × Nклеток, потому что внутриNклеток толькоN − 1границ между ними. - Перепутать
C(2(N-1), N-1)иC(2(N-1), 2). Биномиальный коэффициент — про выбор позиций для одного из двух типов ходов. - При больших
Nответ растёт примерно как4^N / √(πN)(формула Стирлинга для центрального биномиального коэффициента). ДляN = 8уже 3432; дляN = 20— порядка10^10.
Эталонный ответ
C(2(N − 1), N − 1) = (2N − 2)! / ((N − 1)!)².
Для N = 8: 3432.