问题提出:
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子,如图a所示。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上,如图b所示。
解空间结构:
排列树
代码:
public class Nqueen {
// 属性
static int n ;
static long sum;
static int[] x;
// 初始化
public static long Nqueen(int nn){
n = nn;
sum = 0;
x = new int[n + 1];
for(int i = 0; i <= n;i++) {
x[i] = 0;
}
backtrace(1);
return sum;
}
private static void backtrace(int t) {
if( t > n) {
sum ++;
}
else {
for(int i = 1;i <= n;i++) {
x[t] = i;
if(palce(t)) {
backtrace(t + 1);
}
}
}
}
private static boolean palce(int k) {
for(int i = 1;i < k;i++) {
if((Math.abs(i - k) == Math.abs(x[i] - x[k])) || x[i] == x[k]) {
return false;
}
}
return true;
}
public static void main(String[] args) {
for(int i =1;i <= 10;i++) {
System.out.println(i + " " +Nqueen.Nqueen(i));}
}
}
结果截图: