如何正确转换 n 皇后数组输出

How to Properly convert an Array Output in n-queens

我研究这段代码有一段时间了。我要做的主要事情是试验输出。这是代码的来源: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);
    }

}

我的问题是:我想知道如何使输出更精简。换句话说,如何进行输出,以便在每个可能的解决方案的一组括号中列出皇后的行位置?例如,假设我有一块看起来像这样的 4x4 板:

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();
}

如您所见,在 "if" 语句下,我创建了一个新数组,希望其中包含皇后所在的行号,然后我想将其作为字符串打印出来。不过,我在这方面遇到了错误,我不知道为什么。例如,我知道我试图获得的输出看起来不会像 (x,y,z),但我只是想打印皇后区所在的行,然后担心逗号和括号在后面。但是,如果你能帮助我解决这些问题,那就太好了。错误如下所示:

编辑:我进行了必要的更改,但现在我的输出如下所示: 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));
}

如果您需要打印位置,就像它们是从 1 而不是 0 开始索引一样,您可以这样做:

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));
}