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