请注意:我被要求以任何我喜欢的方式修改NQueens问题。我曾想过这样做,并希望加以实施。这不是一个直接的家庭作业问题,而是一个如何实施我自己的修改的问题。
我已经写了下面的代码,解决了4个皇后。因此,根据这个代码,没有两个皇后可以在同一排,同一列和同一对角线,以便不攻击。我试图修改它,如果我放置一个皇后,那么它可以放在同一列中,但可以跳过两行,它可以放在同一行中,跳过两列,也可以放在同一对角线中,跳过两行和两列。
因此,基本上,用简单的话说,皇后可以放在同一行、同一列和同一对角线上,跳过两个块。
对于4个皇后输出,当前如下所示:
* Q * *
* * * Q
Q * * *
* * Q *和
* * Q *
Q * * *
* * * Q
* Q * *但是is也应该给出以下输出:
Q * * Q
* * * *
* * * *
Q * * Q所以在这里,女王每隔两个街区就被放置一次,水平、垂直和对角线。
代码:
import java.util.*;
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) {
enumerate(4);
}
}我做错了什么?如何更改代码,使其与修改一起工作?
发布于 2013-04-25 19:38:44
你的模型是不可能的。
在您的模型皇后中有下一个坐标:
Oy = q[Ox]; 结果
Q * * Q
* * * *
* * * *
Q * * Q 数组应该在相同位置上有两个值。
q[0] == 0
q[0] == 3
q[3] == 0
q[3] == 3 在一维阵列中是不可能的。你应该改变模型和算法。
https://stackoverflow.com/questions/16222623
复制相似问题