问题描述:在n×n格的棋盘上放置彼此不受攻击的n个皇后,即任意两个皇后互不攻击。按国际象棋的规则,皇后可以攻击与之处在同一列或同一行或同一斜线的棋子。
4皇后解空间如下:
任意两个皇后不能在同一列或同一行或同一斜线上,如图所示:
代码如下:
public class test5_5_1 {
static int n; //皇后个数
static int[] x; //当前解
static long sum; //当前已找到的可行方案数
private static void nQueen1(int nn){
n = nn;
sum = 0;
x = new int[n+1];
for(int i=0;i<=n;i++) x[i] = 0;
backtrack(1);
}
private static boolean place(int t){
//不能和之前的皇后同在一条斜率=±1斜线上,也不能在同一列上
for(int i=1;i<t;i++){ //t表示行下标,x[t]表示列下标
if(Math.abs(t-i)==Math.abs(x[t]-x[i])||x[t]==x[i]) return false;
}
return true;
}
private static void backtrack(int t){
if(t>n) sum++;
else{
//i∈[1:n],可抽象成此节点下第i个分支,也表示n×n矩阵中第i列
for(int i=1;i<=n;i++){ //在第t行下扫描n列
x[t] = i; //第t行,第i列
if(place(t)) backtrack(t+1); //若符合要求,则向下一层节点探索
}
}
}
public static void main(String[] args) {
n = 8;
nQueen1(n);
System.out.println(n+"个皇后共有:"+sum+"种解");
}
}
运行结果如下:
4个皇后共有:2种解
8个皇后共有:92种解