Как правильно преобразовать вывод массива в 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, а затем беспокоиться о запятые и скобки позже. Однако, если вы можете помочь мне с этим, это было бы здорово. Вот как выглядели ошибки:

https://stackru.com/images/c701608fd30ec73857ce5d1a5c280e2996dc8240.png

РЕДАКТИРОВАТЬ: я сделал необходимые изменения, но теперь мой вывод выглядит следующим образом: 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));
}
Другие вопросы по тегам