1

请注意:我被要求以任何我喜欢的方式修改 NQueens 问题。我已经想到了这种方式,并想实现它。这不是一个直接的家庭作业问题,而是一个我如何实施自己的修改的问题。

我在下面编写了一个解决 4 个皇后的代码。所以根据这段代码,没有两个皇后可以在同一行、同一列、同一对角线上,从而不被攻击。我正在尝试修改它,如果我放置一个皇后,那么它可以放在同一列但跳过两行,它可以放在同一行跳过两列,同样它可以放在同一个对角线上跳过两个行和两列。

所以基本上,简单来说,女王可以放置在同一行,同一列和同一对角线上,跳过两个块。

对于 4 个皇后输出当前如下所示:

* Q * *
* * * Q
Q * * *
* * Q *

* * Q *
Q * * *
* * * Q
* Q * *

但是也应该给出以下输出:

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

}

我究竟做错了什么?如何更改我的代码以使其适用于修改?

4

1 回答 1

3

在您的模型中这是不可能的。
在你的模特皇后有下一个坐标:

Oy = q[Ox];  

结果

Q * * Q
* * * *
* * * *
Q * * Q 

数组应该在同一位置有两个值

q[0] == 0  
q[0] == 3  
q[3] == 0  
q[3] == 3  

在一维数组中是不可能的。你应该改变模型和算法

于 2013-04-25T19:38:44.943 回答