八皇后问题需要转换思路,将二维数组棋盘转为一位数组来存储八皇后的位置,不然会相对复杂很多
public class BaQueen {
/*
八皇后问题,使八个皇后不能互相攻击,即不能在同行同列同一斜线上,共有92种解法
*/
static int count;//记录解法次数
final static int MAX=8;//皇后个数
int[] arr=new int[MAX];
public static void main(String[] args) {
//构造一维数组来储存皇后位置,其索引代表其所在行数,其值代表其所在列数
//比如[1,2,3,4,5,7,6,0]第一个皇后所处位置为第一行第二列,第二个皇后所处位置为第二行第三列,当然这个摆放肯定为错的
BaQueen sa=new BaQueen();
sa.fangzhi(0);
System.out.println(count);
}
private void fangzhi(int n){
if(n==MAX){
for (int i : arr) {
System.out.print(i+" ");
}
System.out.println();
count++;
return;
}else {
for (int i = 0; i < MAX; i++) {
arr[n]=i;//将皇后在该行每一列都放置一次,找出是否能通过
if(check(n)){
fangzhi(n+1);//放下一个皇后
}
//如果发生冲突,则放下一列继续判断
}
}
}
private boolean check(int n){
//n代表第几个皇后,需要判断它是否与前面的皇后有冲突
for (int i = 0; i < n; i++) {
//arr[n]==arr[i],则代表这两个皇后处于同一列
//Math.abs(n-i)==Math.abs(arr[n]-arr[i],行与列的长度相同,则代表其在同一斜线上,行数不需要判断,i<n
if(arr[n]==arr[i]||Math.abs(n-i)==Math.abs(arr[n]-arr[i]))
{
return false;
}
}
return true;
}
}