kightl < /em> - шахмат, который движется в L форма. Мы определяем возможные движения kightl (𝑎, 𝑏) как любое движение из какой -то позиции (𝑥 1 , 𝑦 sub> 1 ) до некоторых (𝑥 2 , 𝑦 2 ) удовлетворяющий любой из следующих:
[*] 𝑥 2 = 𝑥 1 ± 𝑎
[*] 𝑦 2 = 𝑦 1 ± 𝑏
< /ul>
тки... 𝑎, 𝑏) Пара, где 1 ≤ 𝑎, 𝑏
Какое минимальное количество движений требуется для kightl < /em> (𝑎, 𝑏) Чтобы получить от позиции (0,0) до позиции (𝑛 - 1, 𝑛 - 1)? Если рыцарь не может добраться до этого пункта назначения, вместо этого ответ -1 < /li>
< /ul>
тки... > ограничения < /h3>
5 ≤ ≤ 25 < /li>
< /ul>
вход выборки < /h3>
5 < /p>
Вывод вывода < /h3>
Код: Выделить всё
4 4 2 8
4 2 4 4
2 4 -1 -1
8 4 -1 1
На диаграмме ниже изображен возможные минимальные пути для kightl (1,1), kightl < /em> (1,2) и kightl (1,3):
один минимальный путь для kightl (1,4 ): < /p>
(0,0) → (1,4) → (2,0) → (3,4) → (4,0) → (0,1) → (4,2) → (0,3) → (4,4)
мы затем [имеем] 4 4 2 8 в качестве первой строки вывода, потому что Kightl (1,1) взял 4 хода, kightl (1,2) взял 4 хода, kightl (1,3) принял 2 хода, и kightl (1,4) взял 8 ходов.
Я использовал простые петли и рекурсивный подход. Мой код работает, но у него очень высокая сложность. Это мой код: < /p>
Код: Выделить всё
public class lknightmycode {
public static boolean canreach(int[][] board, int row, int col) {
if(row>=0 && col>=0 && row< board.length&&col< board.length&&board[row][col]==-1){
return true;
}
else return false;
}
public static int helper(int[][] board, int row, int col, int crow, int ccol, int steps) {
if (crow == board.length - 1 && ccol == board.length - 1){
return steps;}
if (canreach(board, crow, ccol)) {
board[crow][ccol] = 0;
int minSteps = Integer.MAX_VALUE;
int[] dr = {-row, -row, row, row,col, -col, col, -col};
int[] dc = {col, -col, col, -col,-row, -row, row, row};
for (int i = 0; i < 8; i++) {
int newRow = crow + dr[i];
int newCol = ccol + dc[i];
int currentSteps = helper(board, row, col, newRow, newCol, steps + 1);
if (currentSteps != -1) {
minSteps = Math.min(minSteps, currentSteps);
}
}
board[crow][ccol] = -1; // Reset the board position
return (minSteps == Integer.MAX_VALUE) ? -1 : minSteps;
}
return -1;
}
public static int[][] knightlOnAChessboard(int n) {
int[][] board = new int[n][n];
int[][] Result = new int[n - 1][n - 1];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
board[i][j] = -1;
}}
for (int i = 0; i < n-1; i++) {
for (int j = 0; j
Подробнее здесь: [url]https://stackoverflow.com/questions/76332862/knight-moves-on-a-chessboard-for-different-definitions-of-a-knight-move[/url]