【题目】
在N×N的棋盘上要摆N个皇后,要求任何两个皇后不同行不同列,也不再同一条斜线上。给定一个整数n,返回n皇后的摆法有多少种。
【举例】
n=1,返回1
n=2或3,无论怎么摆都不行,返回0
n=8,返回92
【代码】
public static void main(String[] args) {
System.out.println(queen(1));//1
System.out.println(queen(2));//0
System.out.println(queen(8));//92
}
//N皇后问题
public static int queen(int n){
if(n<1){
return 0;
}
int[] record=new int[n];//record[i]表示第i行皇后所在的列数
return queenprocess(0,record,n);
}
private static int queenprocess(int i, int[] record, int n) {
if(i==n){
return 1;//最后一行只有一个位置?
}
int res=0;
for(int j=0;j<n;j++){//从第0列开始依次放置皇后,判断该位置是否合适
if(isValid(record,i,j)){
record[i]=j;
res+=queenprocess(i+1,record,n);//递归,逐行寻找皇后位置
}
}
return res;
}
private static boolean isValid(int[] record, int i, int j) {
for(int k=0;k<i;k++){//查看前i行的皇后位置
if(j==record[k]||Math.abs(record[k]-j)==Math.abs(k-i)){
return false;//同列、在斜线上,都不能放皇后
}
}
return true;
}