Handsome Fad Ответов: 2

Проблема N-рыцарей


Hi Sir,
 I am Java Learner, I would like to seek for help on my coding.
 The requirement is as below,
 The knights must visits the maximum number of board positions without attacking each other. The Knight can move in the shape of the letter, 'L', over two in one direction and then over one in a perpendicular direction. If the Knight rests at the square marked X.
 Please assist, thanks.


Что я уже пробовал:

Мое кодирование,
Package knightstour;
 import java.util.*;
 public class KnightsTour {

 private static int board[][] = new int[8][8];
 private static int stepCounter = 1;

 public KnightsTour() {
 initBoard(board);
 tour(0,0);
 printSol(board);
 }
 public static void printSol(int[][] a) {
 for (int i = 0; i < a.length; i++) {
 for (int j = 0; j < a[i].length; j++) {
 if(a[i][j]>9){
 System.out.print(a[i][j] + " ");
 }else{
 System.out.print(a[i][j] + " ");
 }
 }
 System.out.println();
 }
 System.out.println();
 }
 public static void initBoard(int[][] a) {
 for (int i = 0; i < a.length; i++) {
 for (int j = 0; j < a[i].length; j++) {
 a[i][j] = -1;
 }
 }
 }
 public void tour(int x, int y) {
 if (((x < 0) || (x >= 8) || (y < 0) || (y >= 8)) || (board[x][y] != -1)) {
 return;
 } else {
 stepCounter++;
 board[x][y] = stepCounter;
 tour(x+2, y+1);
 tour(x+1, y-2);
 tour(x+1, y+2);
 tour(x-1, y+2);
 tour(x-2, y-1);
 tour(x-2, y+1);
 tour(x-1, y-2);
 tour(x+2, y-1); 
 }
 }
 public boolean spaceAvailable(int X, int Y) {
 }
 Public static void main(String[] args){
 new KnightsTour();
 }
 }

Patrice T

В чем же вопрос?

Patrice T

Требование выглядит как крест из 2 классических задач, вы перефразировали это требование?

"Моя кодировка не может соответствовать нижеприведенным требованиям,"
Это не информативно.

OriginalGriff

- почему бы тебе не сделать за меня домашнее задание?"
:смеяться:

Patrice T

:)

2 Ответов

Рейтинг:
0

OriginalGriff

Пара вещей:
1) Если вы хотите, чтобы другие люди читали ваш код, напишите его так, чтобы его было легко читать.
Это значит сделать отступ:

for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a[i].length; j++) {
if(a[i][j]>9){
System.out.print(a[i][j] + " ");
}else{
System.out.print(a[i][j] + " ");
}
}
System.out.println();
}
Это не так легко читать. Это:
for (int i = 0; i < a.length; i++) {
    for (int j = 0; j < a[i].length; j++) {
        if(a[i][j]>9){
            System.out.print(a[i][j] + " ");
        }else{
            System.out.print(a[i][j] + " ");
        }
    }
    System.out.println();
}
Потому что отступ помогает вам "следить" за тем, что идет куда и какая скобка соответствует чему.
Это также означает, что вы не используете односимвольные переменные, потому что они быстрее набираются: например, "а" в приведенном выше коде - вам может сойти с рук i и j, но они были бы лучше, как y и x потому что это делает более очевидным то, что они делают: перебирают строки (y) и столбцы (x).

2) Мы не делаем домашнее задание: оно задано не просто так. Она существует для того, чтобы вы думали о том, что вам сказали, и пытались понять это. Он также существует для того, чтобы ваш наставник мог определить области, в которых вы слабы, и сосредоточить больше внимания на корректирующих действиях.
И этот код не начинает отвечать на заданный вам вопрос. Он устанавливает доску, но "мясо" вопроса даже не начинается!

Попробуйте сами, возможно, вы обнаружите, что это не так сложно, как вы думаете!

Если вы столкнетесь с конкретной проблемой, то, пожалуйста, спросите об этом, и мы сделаем все возможное, чтобы помочь. Но мы не собираемся делать все это для вас!


OriginalGriff

Если бы вы попробовали, у вас был бы код, который демонстрирует это: вы вообще не показываете нам этого: вы сделали тривиальные биты, но полностью оставили фактическую работу.
Мы здесь не для того, чтобы делать это для вас!

Рейтинг:
0

Graeme_Grant

Если бы вы искали вопросы и ответы на этом сайте, то нашли бы несколько решений, в том числе и это: Задача кодирования: рыцарь на шахматной доске[^]


Patrice T

По-моему, это не проблема.
Смотрите, он должен разместить максимум рыцарей на шахматной доске.

Graeme_Grant

О... это звучит как забавный вызов... :P

На самом деле, звучит так же, как вызов, который мы сделали:

- Рыцари должны занять максимальное количество позиций на доске, не нападая друг на друга."

Одно из моих решений (бонусная Задача 3 - дуэльные рыцари), приведенное в ссылке выше, обрабатывает более 1 рыцаря. Но я думаю, поскольку это не указано в вопросе, что речь идет только о 1 рыцаре.