Как правильно преобразовать вывод массива в n-ферзь
Я играл с этим кодом некоторое время. Главное, что я пытаюсь сделать, это поэкспериментировать с выходом. Вот источник кода: 1
Код Java, который они использовали, выглядит следующим образом:
public class Queens {
/***********************************************************************
* Return true if queen placement q[n] does not conflict with
* other queens q[0] through q[n-1]
***********************************************************************/
public static boolean isConsistent(int[] q, int n) {
for (int i = 0; i < n; i++) {
if (q[i] == q[n]) return false; // same column
if ((q[i] - q[n]) == (n - i)) return false; // same major diagonal
if ((q[n] - q[i]) == (n - i)) return false; // same minor diagonal
}
return true;
}
/***********************************************************************
* Print out N-by-N placement of queens from permutation q in ASCII.
***********************************************************************/
public static void printQueens(int[] q) {
int N = q.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (q[i] == j) System.out.print("Q ");
else System.out.print("* ");
}
System.out.println();
}
System.out.println();
}
/***********************************************************************
* Try all permutations using backtracking
***********************************************************************/
public static void enumerate(int N) {
int[] a = new int[N];
enumerate(a, 0);
}
public static void enumerate(int[] q, int n) {
int N = q.length;
if (n == N) printQueens(q);
else {
for (int i = 0; i < N; i++) {
q[n] = i;
if (isConsistent(q, n)) enumerate(q, n+1);
}
}
}
public static void main(String[] args) {
int N = Integer.parseInt(args[0]);
enumerate(N);
}
}
У меня такой вопрос: мне было интересно, как сделать вывод более упорядоченным. Другими словами, как я могу сделать вывод так, чтобы у меня были положения строк королевы, перечисленные в скобках для каждого возможного решения? Например, скажем, у меня есть доска 4х4, которая выглядит так:
xxQx Qxxx xxxQ xQxx
и вместо того, чтобы иметь вышеупомянутый вывод, я хочу что-то вроде: (2,4,1,3), где "2" иллюстрирует королеву во втором ряду (первый читается при взгляде справа налево), "4" представляет королеву в 4-м ряду и т. д. Поскольку я относительно новичок в программировании, я не слишком уверен, как это сделать. Это то, что я на самом деле пробовал в части кода printQueens:
public static void printQueens(int[] q) {
int N = q.length;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (q[i] == j)
int[] rowPos = new int[1+j];
System.out.print(Arrays.toString(rowPos));
}
System.out.println();
}
System.out.println();
}
Как вы можете видеть, в выражении "если" я создал новый массив, который, как я надеялся, будет содержать номера строк, в которых были королевы, тогда я хотел вывести это как строку. Я получаю ошибки по этому вопросу, и я понятия не имею, почему. Я знаю, что вывод, который я пытаюсь получить, не будет выглядеть, например, (x,y,z), но я просто пытаюсь напечатать строки, где находятся Queens, а затем беспокоиться о запятые и скобки позже. Однако, если вы можете помочь мне с этим, это было бы здорово. Вот как выглядели ошибки:
РЕДАКТИРОВАТЬ: я сделал необходимые изменения, но теперь мой вывод выглядит следующим образом: 1
Не уверен, почему он печатает его в зависимости от количества строк в массивах. Мне просто нужен один вывод для решения, показывающий номер строки ферзей
1 ответ
if (q[i] == j)
int[] rowPos = new int[1+j];
System.out.print(Arrays.toString(rowPos));
Если это должно быть if
блок, вам нужно использовать брекеты.
if (q[i] == j) {
int[] rowPos = new int[1+j];
System.out.print(Arrays.toString(rowPos));
}
Но твой rowPos
массив всегда будет содержать нули, потому что вы ничего не помещаете в него.
Редактировать:
Если вы просто хотите распечатать содержимое q
Кажется, это то, что вы говорите, вы можете избавиться от циклов и просто сделать это:
public static void printQueens(int[] q) {
System.out.println(Arrays.toString(q));
}
Если вам нужно напечатать позиции так, как будто они проиндексированы с единицы вместо нуля, вы можете сделать это следующим образом:
public static void printQueens(int[] q) {
int[] adjusted = new int[q.length];
for (int i = 0; i < q.length; ++i) {
adjusted[i] = q[i] + 1;
}
System.out.println(Arrays.toString(adjusted));
}