心血来潮,编写了一个八皇后的递归算法,可以得出存在的解。
这里没有打印棋,所以对解做一个说明。
比如4皇后的解为:[[1, 3, 0, 2], [2, 0, 3, 1]]
表示有两个解:[1, 3, 0, 2] 与 [2, 0, 3, 1],以[1, 3, 0, 2] 说明:
1、皇后1放在第一行第二列的位置,坐标为:(0,1)
2、皇后2放在第二行第四列的位置,坐标为:(1,3)
3、皇后3放在第三行第一列的位置,坐标为:(3,0)
4、皇后4放在第四行第三列的位置,坐标为:(4,2)
棋盘如下图所示:
0 1 2 3
0 - O - -
1 - - - O
2 O - - -
3 - - O -
代码如下:
public class Queens {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Date begin =new Date();
int num=4;
Queens q=new Queens();
List<List> rl=new ArrayList<List>();
q.queensPos(num,new ArrayList<Integer>(), rl);
Date end =new Date();
System.out.println(num+"皇后,共"+rl.size()+"个解,耗时:"+
String.valueOf(end.getTime()-begin.getTime())+ " 毫秒,计算结果:\n"+rl.toString());
}
private boolean checkPos(List<Integer> state,int nextX){
if(state.size()==0) return false;
int nextY=state.size();
for( int i=0;i<nextY;i++){
if(Math.abs(state.get(i)-nextX)==0
|| Math.abs(state.get(i)-nextX)==(nextY-i)){
return true;
}
}
return false;
}
private void queensPos(int num, List<Integer>state,List<List>qlist){
for(int pos=0;pos<num;pos++) {
if(! checkPos(state,pos)) {
if(state.size()==num-1) {
state.add(pos);
qlist.add(state);
return;
}else {
List<Integer> tmp=new ArrayList<Integer>(state);
tmp.add(pos);
this.queensPos(num, tmp, qlist);
}
}
}
}
}
当num=5(5皇后)的解为(10个解):
[[0, 2, 4, 1, 3], [0, 3, 1, 4, 2], [1, 3, 0, 2, 4], [1, 4, 2, 0, 3], [2, 0, 3, 1, 4], [2, 4, 1, 3, 0], [3, 0, 2, 4, 1], [3, 1, 4, 2, 0], [4, 1, 3, 0, 2], [4, 2, 0, 3, 1]]