题目:在8*8的国际象棋上摆放8个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一条对角线上。请问总共有多少种符合条件的摆法?
剑指offer上给出的是全排列法,解法步骤如下:
(1)定义数组ColumnIndex[8],数组中第I个数字表示位于第i行的皇后的列号;
(2)对数组用0~7进行初始化,初始化就保证了任意两个皇后不同列;
(3)对数组进行全排列;
(4)判断每一个排列对应的8个皇后是不是在同一条对角线上(ColumnIndex[i]-ColumnIndex[j]==i-j或ColumnIndex[i]-ColumnIndex[j]==j-i)。
具体的代码如下:
public class EightQueen {
//用全排列解决八皇后问题
static int count=0;//全局变量
public static void main(String[] args) {
int[] ColumnIndex= {0,1,2,3,4,5,6,7};
eightQueen(ColumnIndex,0);
System.out.println("八皇后问题共有"+count+"种解法");
}
public static void eightQueen(int[] ColumnIndex,int index) {
if(ColumnIndex==null||ColumnIndex.length!=8) {
return ;
}
int len=ColumnIndex.length;
if(index==len-1) {
boolean res=true;
for(int i=0;i<len;i++) {
for(int j=i+1;j<len;j++) {
if(i-j==ColumnIndex[i]-ColumnIndex[j]||i-j==ColumnIndex[j]-ColumnIndex[i]) {
res=false;
break;
}
}
}
if(res) {
count++;
for(int i=0;i<len;i++) {
System.out.print(ColumnIndex[i]+" ");
}
System.out.println("");
}
}else {
for(int i=index;i<len;i++) {
int temp=ColumnIndex[index];
ColumnIndex[index]=ColumnIndex[i];
ColumnIndex[i]=temp;
eightQueen(ColumnIndex,index+1);
temp=ColumnIndex[index];
ColumnIndex[index]=ColumnIndex[i];
ColumnIndex[i]=temp;
}
}
}
}