问题描述:
在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或 同一列或同一斜线上。
package edu.xalead;
public class n后问题 {
static int n; //皇后个数
static int[] x; //当前解
static long sum; //当前已找到的可行方案数
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;
backtrack();
return sum;
}
private static boolean place(int k){//检查第k行的可行性
for(int j =1;j<k;j++)
if((Math.abs(k-j)==Math.abs(x[j]-x[k]))||(x[j]==x[k])) return false; //满足此条,说明不符合条件,即处在同一行或同一列或同一斜线
return true;//说明符合条件
}
private static void backtrack() { //递归方法
x[1] = 0;
int k=1;
while(k>0){
x[k]+=1;
while((x[k]<=n&&!(place(k)))) x[k]+=1;//不符合条件就一直右移一列
if(x[k]<=n) //没有出界
if(k==n) sum++; //抵达最后一行,即到达叶子节点 ,可行方案数+1
else{
k++; //下移一行
x[k] = 0; //将初值赋值为0
}
else k--; //说明这个方法行不通,向上退一行
}
}
public static void main(String[] args) {
n后问题 q = new n后问题();
System.out.println("该皇后的解决方案有" + q.nQueen(8) + "种");
}
}
运行结果: