暴力枚举法解决八皇后问题,问题的关键在于如何记录皇后的位置,以及如何判断他们是不是按要求摆放。
1.首先我们可以利用一位数组来表示皇后的位置(如a[1] = 2表示第一列第二行有一个皇后),当枚举各种摆放位置来更新这个一维数组。
2.其次,要如何去判断他们是否摆放合适呢,还是对数组里存的值进行一次判断,首先我们可以确定的是每一列只可能有一个皇后,所以我们先判断他们的行是否有重复a[i] ==a[j]则表示重复了,其次再比较他们的斜列是否重复,abs(a[i]-a[j]) == i - j表示重复。在方法中遍历的时候切记“j <= i-1”而非小于,仅仅一个等号,结果可谓天壤之别,一个有180多万种结果,一个有92种。当然后者为正确答案。
public class 八皇后问题_枚举 {
//定义棋盘
static int[][] qipan = new int[9][9];
public static void main(String[] args) {
Queen();
}
static void Queen(){
//定义一个标记数组 a[1] = 2表示第一列第二行有一个皇后
int[] a = new int[9];
//定义计数器
int count = 0;
int i;
for (a[1] = 1;a[1] < 9;a[1]++)
for (a[2] = 1;a[2] < 9;a[2]++)
for (a[3] = 1;a[3] < 9;a[3]++)
for (a[4] = 1;a[4] < 9;a[4]++)
for (a[5] = 1;a[5] < 9;a[5]++)
for (a[6] = 1;a[6] < 9;a[6]++)
for (a[7] = 1;a[7] < 9;a[7]++)
for (a[8] = 1;a[8] < 9;a[8]++){
if(!cover(a))
continue;
else{
count++;
qipan[a[1]][1] = 1;
qipan[a[2]][2] = 1;
qipan[a[3]][3] = 1;
qipan[a[4]][4] = 1;
qipan[a[5]][5] = 1;
qipan[a[6]][6] = 1;
qipan[a[7]][7] = 1;
qipan[a[8]][8] = 1;
for (i = 1;i < 9;i++){
for (int j = 1;j < 9;j++){
System.out.print(qipan[i][j]+" ");
qipan[i][j] = 0;
}
System.out.println();
}
System.out.println();
}
}
System.out.println("一共有"+count+"种方法");
}
static boolean cover(int a[]){
int i = 2;
int j = 1;
boolean res = true;
for(i = 2;i < 9;i++){
for(j = 1;j <= i-1;j++){
if((a[i] == a[j]) || ((Math.abs(a[i]-a[j])) == i -j)){
res = false;
break;
}
}
if(!res)
break;
}
return res;
}
}