Как может быть и 0-th
, и m-th
строк в матрице с общим количеством m
строк?
В любом случае, простой Dijkstra даст вам оптимальный путь в O(n*m)
(при условии, что у вас есть хорошая структура данных, чтобы найти минимум в списке еще не достигнутых точек).
Кроме того, если ваш рыцарь может двигаться только вниз по доске (иногда полезно подняться вверх, чтобы уменьшить общий вес пути), вы можете написать простое DP. Просто начните с нижней части доски и для каждой позиции рассчитайте, сколько потребуется, чтобы достичь дна. Поскольку вы можете сделать до 4 ходов из каждой позиции, это простая проверка на минимум. Как то так
for (int row = m - 1; row >= 0; --row) {
for (int col = 0; col < m; ++col) {
int path1 = a[row][col + 1] + a[row][col + 2] + a[row + 1][col + 2] + best[row + 1][col + 2];
int path2 = a[row][col + 1] + a[row + 1][col + 1] + a[row + 2][col + 1] + best[row + 2][col + 1];
int path3 = ...
int path4 = ...
best[row][col] = min(path1, path2, path3, path4);
}
}
редактировать
Зачем вам нужно идти вверх? Представьте себе такую матрицу (где *
означает какое-то смехотворно большое число, например, 1000000000). Очевидно, что вам придется пройти от (0, 0)
до правой части доски, прежде чем идти вниз.
111111111111
111111111111
*********111
*********111
Итак, путь будет выглядеть так
...1...1...1
11...1...1..
*********11.
*********11.