用Java解决八皇后问题
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果
思路分析:
三个方法:
check()递归调用求解
judge()判断放的位置是否合理,与之前的是否冲突
show()用于打印结果
个人的见解,如有错误或者更好的,望不吝赐教!
public class Queue8 {
int[] arr=new int[8];//存储8个皇后
static int count=0;//正解的个数
public static void main(String[] args){
Queue8 queue8=new Queue8();
queue8.check(0);
System.out.println("一共有"+count+"种解法");
}
private void check(int n){//递归求解
if(n==8){//跳出递归的条件
show();
return;
}
for(int i=0;i<8;i++){
arr[n]=i;
if(judge(n)){
check(n+1);
}
}
}
private boolean judge(int 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;
}
}
return true;
}
private void show(){
count++;
for(int i=0;i<8;i++){
System.out.print(arr[i]+" ");
}
System.out.println();
}
}