在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路- 回溯法
- 三种情况
- 在此行找不到位置
- 找到位置,且此行为最后一行 。得到一个解,way++
- 找到位置,不为最后一行,递归找下一行
1.用斜率判断周围是否有棋子,因为斜线的斜率绝对值是1,所以很好判断。
2.第一次写我几乎是手动回溯,没有利用好递归的性质,一直在思考这么把这次的结果传到下一个递归中,而很少思考如何用这次的递归去处理上一次的递归。这一点很难说。
public class Queen {
static int way = 0;
private final static int N = 8;
public static void main(String[] args) {
int[] ar = {-1,-1,-1,-1,-1,-1,-1,-1};
put(ar,0);
System.out.println(way);
}
static void put(int[] ar,int row){
for (int i = 0; i < N; i++) {
if(CheckChart(ar,row,i)){
ar[row] = i;
if(row!=7){
// 找到位置,为下一个皇后分配位置
put(ar,row+1);
}else{
// 找到位置,且为最后一行,得到一种解法
way++;
}
}
}
}
static boolean CheckChart(int[] ar,int row,int col){
//
for (int i = 0; i < row; i++) {
if(ar[i]!=-1){
int rowDiffer_abs = Math.abs(i-row);
int colDiffer_abs = Math.abs(ar[i]-col);
// 同列
if(ar[i] == col) return false;
// 同对角线
if(rowDiffer_abs == colDiffer_abs) return false;
}
}
return true;
}
}



