【发布时间】:2015-05-26 15:28:09
【问题描述】:
我一直在玩这个代码一段时间。我想做的主要事情是对输出进行实验。以下是代码来源: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语句之后的行周围加上大括号{}。您的System.out.print(Arrays.toString(rowPos));已缩进,但它目前不属于if块。 -
哇,那些编译错误具有灾难性的误导性。
-
您应该开始使用 IDE 以获得更好的错误跟踪。
-
是的......我认为主要是错误让我失望。
标签: java arrays tostring n-queens