代码如下:
import java.util.ArrayList;
public class EightQueue {
/**
* 由于每行必有一个皇后,所以在dfs时,只考虑,将这个行的皇后放到列的哪个位置;否则会出现重复现象
*/
private static ArrayList<Float> ylist,pointlist1,pointlist2;
private static int time=0;
public static void main(String[] args) {
// TODO 自动生成的方法存根
ylist=new ArrayList<Float>();
pointlist1=new ArrayList<Float>();
pointlist2=new ArrayList<Float>();
dfs(1);
System.out.println(time);
}
private static void dfs(float amount) {
// TODO 自动生成的方法存根
if(amount>8){
return;
}
for(float j=1;j<=8;j++){
if(check(j,ylist)){
ylist.add(j);
if(check(reckon(j,amount,1),pointlist1)&&check(reckon(j,amount,-1),pointlist2)){
//放置第8个时条件都符合,情况数+1
if(amount==8){
time++;
}
pointlist1.add(reckon(j,amount,1));
pointlist2.add(reckon(j,amount,-1));
dfs(amount+1);
pointlist1.remove(pointlist1.size()-1);
pointlist2.remove(pointlist2.size()-1);
}
ylist.remove(ylist.size()-1);
}
}
}
private static float reckon(float x,float y,int flag){
float b1=0;
if(flag==1){
b1=y-x;
}else if(flag==-1){
b1=y+x;
}
return b1;
}
//not contain i return true ,or return false
private static boolean check(float i, ArrayList<Float> list2) {
// TODO 自动生成的方法存根
int len=list2.size();
if(len==0){
return true;
}
for(int p=0;p<len;p++){
if(i==list2.get(p)){
return false;
}
}
return true;
}
}