八皇后问题-递归
思路:
- 解法存储思路: 一维数组,arr[8], 下标表示第 n 个(行)皇后, value 表示第 n 个皇后所在的列
- 判断第 n 个皇后与前面摆放的 n - 1 个皇后是否冲突
2.1 因为一维数组,下标++,不会发生行冲突
2.2 判断列冲突 arr[n] == arr[i]
2.3 判断斜线: 利用斜率 : (y1-y2) / (x1 - x2) = 1- 摆放棋子:
3.1 结束条件:判断是否摆完
3.2 循环 i = 0 至 8 , 遍历每一行的列
3.3 若不冲突,递归调用自己进行下一行(个) 的 摆放 ----- check(n+1)
public class Queen8 {
int max = 8;
// 存储八皇后解法
// 下标为八皇后的行, value 为八皇后的列
int[] arr = new int[max];
static int count = 0; // 记录有多少种解法
public static void main(String[] args) {
Queen8 q = new Queen8();
q.check(0);
System.out.println("共有 " + count + " 种");
}
/**
* 摆放第 n 个皇后
*/
public void check(int n){
if(n == max){
// 表示得到了一种解法了
print();
return ; // 打印完后回溯上一个栈
}
for (int i = 0 ; i < max ; i++){
arr[n] = i;
// 第 n 个皇后 (行) 第 i 列
if(judege(n)){
// 判断该第 n 个皇后的 第 i 列是否与前面的摆放有冲突。
// true 无冲突
check(n+1);
}
}
}
/**
* 判断当前第 n 个皇后的摆放与前n个是否有冲突。
*
* @return
*/
public boolean judege(int n) {
// 遍历前面的 n-1 个查看是否有冲突
for (int i = 0; i < n; i++) {
// arr[i] == arr[n] 判断是否在同一列
// Math.abs(n - i) == Math.abs(arr[n] - arr[i]) 判断是否在同一个斜线
// 可以理解成 (y1 - y2)/(x1-x2) = 1 斜率
if (arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
return false;
}
}
return true;
}
/**
* 打印数组内容
*/
public void print(){
count++;
for (int i = 0 ; i < max ; i++){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}