Рыцарь движется на шахматной доске для разных определений рыцаря движенияJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Гость
 Рыцарь движется на шахматной доске для разных определений рыцаря движения

Сообщение Гость »

Я пытаюсь решить проблему хакерранка Найтл на шахматной доске: < /p>

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]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»