【题目】如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。(不能在同一行,不能在同一列,不能再同一对角线),问有多少种解法?
【解题思路】
1、3个限制条件:不能同行、不能同列、不能在同一斜线上
2、思路:
public class Queen {
// count记录有多少种解法
public static int count=0;
// 一般这种问题都是一个二维数组,a数组记录皇后所放的位置(也就是每行的列值)
public static int FindNQueen(int[] a){
// n表示棋盘边界值
int n = a.length;
// 回溯函数
backTrace(0,n,a);
return count;
}
/**
* 回溯函数
* @param row 行数
* @param n 边界
* @param a 皇后位置
*/
public static void backTrace(int row,int n,int[] a){
// 终止条件:所有行都放有皇后则产生一种解法
if (row == n){
count++;
return;
}
//枚举所有棋盘位置
for(int i=0; i<n; i++){
if(check(row,i,a)){
a[row]=i;//如果满足条件则放置皇后在该位置上
backTrace(row+1,n,a);//递归(继续放下一个皇后)
a[row]=0;//回溯(如果下一个皇后没有一个位置满足条件,则撤销这个这皇后位置重新放置)
}
}
}
// 是否3个符合条件(3个限制条件:不能同行、不能同列、不能在同一斜线上)
public static boolean check(int row,int n,int[] a){
for(int i=0; i<row; i++){
if(a[i] == n){
return false;
}
if(Math.abs(row-i) == Math.abs(n - a[i])){
return false;
}
}
return true;
}
}