八皇后问题

package A;

public class JosePhu {
public static void main(String[] args) {

//听说八皇后问题面试经常问,能不能用贪心算法把它给优化一下?
Method method=new Method();
method.check(0);
System.out.println("一共有多少种解法count="+method.count);
System.out.println("一共调用了多少次方法judgeCount="+method.judgeCount);
}
}

package A;

public class Method {
int max=8;
int[] array=new int[max];
int count=0;
int judgeCount=0;

public void print(){
count++;
for (int i = 0; i < array.length; i++) {
System.out.print(array[i]+" ");
}
System.out.println();
}
//用来判断这个点能不能放
public boolean judge(int n){
judgeCount++;
for (int i = 0; i < n; i++) {
//判断是否在同一列||在同一斜线,验算便知,这个很精妙,
// array的i不仅代表的是第几个皇后(他是从第0个开始的),
// 又是代表的第几行(也是第0个开始的,所以好像只在此情况下有用)
if (array[i]==array[n]||Math.abs(n-i)==Math.abs(array[n]-array[i])){
return false;
}
}
return true;
}
//开始放了
public void check(int n){//这里n我带进来的是0,所以就是二维数组的第一行
if (n==max){//如果恰好能够放满8个皇后,就输出,它用的是一维数组
print();
System.out.println("----------------");
return;
}
for (int i = 0; i < max; i++) {
//先把当前这个皇后n,放到该行的第一列
array[n]=i;
//然后判断能不能放,能的话就放下一个皇后
if (judge(n)){
//递归我认为还是先要能够抽象理解,不要去穷举,除非是你自己设计的
//n+1你知道是什么吗?这题本来是要用8行8列的,但是运用了递归就可以用一维数组解决二维
// 数组的问题了,所以n+1是代表下一行,你把它用8行8列的图形来想象
check(n+1);
//如果这个check(n+1);冲突的话,就返回到上一级的check(n);的array[n]=i;然后i++
}
}
}
}

posted @ 2021-07-28 16:14  朱在春  阅读(114)  评论(0编辑  收藏  举报