package edu.xufe.recursive;
/**
* 八皇后问题--->回溯法
* @author zc
*
*/
public class Queen8 {
int max = 8;
int[] arrs = new int[max];
static int count = 0;
public static void main(String[] args) {
Queen8 queen8 = new Queen8();
queen8.check(0);
System.out.println("总的有多少种解法:"+count);
}
/**
* 放第几个皇后,方法执行完得到当前放的第n个皇后的后面皇后有多少种放法
*/
public void check(int n) {
if(n == max) {//已经放好n个皇后【从0开始】
print();
return;
}
for(int i = 0; i < max; i++) {
//没放个皇后都从第一列开始放
arrs[n] = i;
if(judge(n)) {//判断当前皇后放在当前所在的列是否与前面的皇后冲突
check(n+1);//不冲突放下一个
}
//如果不冲突就继续试探下一列是否可以放
}
}
/**
* 判断当前皇后是否与前面的所有皇后冲突
*/
public boolean judge(int n) {
for(int i = 0;i < n; i++) {
/*
* arrs[n] == arrs[i]在同一列上
* Math.abs(arrs[n]-arrs[i]) == Math.abs(n-i) 在同一斜线上【列之间的差距与行之间的差距相同】
* 因为行数是不断变化的,所以不可能在同一行,即不做判断
*/
if(arrs[n] == arrs[i] || Math.abs(arrs[n]-arrs[i]) == Math.abs(n-i)) {
return false;//冲突
}
//继续判断下一个
}
return true;//不冲突
}
public void print() {
count++;
for(int i = 0; i<arrs.length; i++) {
System.out.print(arrs[i]+" ");//不换行
}
System.out.println();//换行
}
}
八皇后问题-回溯法解决
最新推荐文章于 2023-10-04 14:18:53 发布