package day9;
import java.lang.reflect.Array;
public class bahuanggou {
//定义一个数组保存结果array
int max =8;
static int count=0;
int[] arr =new int[max];
public static void main(String[] args) {
bahuanggou bahuanggou = new bahuanggou();
bahuanggou.check(0);
System.out.println(count);
}
//将皇后的位置输出---------------------------------------------------------------------
private void print(){
for (int i=0;i<arr.length;i++){
System.out.print(arr[i]+" ");
}
count++;
System.out.println();
}
// 判断是否冲突 同一行,列,斜线。-----------------------------------------------------------
//当我们放置第n个皇后时,就去检测该皇后和前面是否冲突。只需输入n就可以自己判断
private boolean judge(int n){ //n表示第n个皇后
for (int i=0;i<n;i++){
if (arr[i]==arr[n]||Math.abs(n-i)==Math.abs(arr[n]-arr[i])){
return false;
//arr[i]==arr[n]表示判断第n个皇后和前面的皇后在同一列
// Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 判断是否在同一斜线。
// 斜率 arr[n]-arr[i] / n-i
// 同一行不用判断
}
}
return true;
}
//----------------------- 编写方法,放置皇后。--------------------------------------------
private void check(int n){
if(n==max){ //每次都要插入八个皇后
print();
return;
}
for (int i=0;i<max;i++){ //依次放入皇后 i表示每一行的每一个列从0--8依此增长
arr[n]=i; //将第n个皇后先放在第i个位置 i从0--8增长。
if (judge(n)){
check(n+1);
//判断此时的n皇后和前面的有没有冲突,没有冲突的话,就判断他的下一行。
//有冲突的话,就把他移到下一个位置i。
//每次判断都是一个试错的过程,1正确,2错误就要改变2,当2所以的位置都尝试了失败,
// 就要回溯到1改变1的位置。
//思考:1.n=0,将第一个皇后放在第一个位置,判断位置通过,check(n+1)继续第二个皇后,从1-8,第一个位置冲突,i+1 ,移到了第二个位置
// 第二个也冲突。,i+1,第三个不冲突。第二个位置确定。第三个皇后,
// 第四个,第五个发现没有合适的,就要回溯第四个,再测试第五个还是没有合适,继续回溯第三个。直到所有的都找到。
// 皇后的移动:check(n+1) 列的遍历:i++
}
}
}
}
八皇后问题
最新推荐文章于 2024-11-07 23:24:07 发布