8皇后是非常经典的递归回溯问题,具体如何实现与理解可以边看代码边理解,代码中注释写的非常详细,如有无法理解的部分可在评论留言。
/**
* @Author: taoqianlilang
* @Description:
* @Date: Created in 15:39 2020/4/9
* @Modified By:
*/
public class Queue8 {
/**
* 有多少种放法
*/
static int count=0;
/**
* 一共判断多少次
*/
static int jugCount=0;
/**
* 有多少个皇后
*/
int max=8;
/**
* 存放皇后的位置
*/
int [] array=new int[max];
/**
* 打印皇后的摆放位置到控制台
*/
private void print(){
count++;
for (int i=0;i<array.length;i++){
System.out.printf("%d\t",array[i]);
}
System.out.println();
}
/**
* @param n 代表第几个皇后
* @return 是否能放
*/
private boolean judger(int n){
for (int i=0;i<n;i++){
jugCount++;
//array[n]==array[i] 表受否是列重复
// Math.abs(n-i)==Math.abs(array[n]-array[i])是否在同一个斜线上
if (array[n]==array[i]|| Math.abs(n-i)==Math.abs(array[n]-array[i])){
return false;
}
}
return true;
}
/**
* @param n 检查皇后个数是否是8
*/
private void check(int n){
//这等于8时候皇后都已经放好了 0到7放的皇后
if (n==max){
print();
return;
}
for (int i=0;i<max;i++){
//先把这个皇后放到该行的第一列
array[n]=i;
if (judger(n)){
//不冲突,开始递归,放下一个皇后
check(n+1);
}
//冲突了会继续执行这个循环 会尝试放第二列看行不行
}
}
public static void main(String[] args) {
Queue8 queue8=new Queue8();
queue8.check(0);
System.out.println(count);
System.out.println(jugCount);
}
}