Рыцарь движется на шахматной доске для разных определений рыцаря движения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»