非常簡潔的八皇后問題的遞歸算法(JAVA版)

心血來潮,編寫了一個八皇后的遞歸算法,可以得出存在的解。

這裏沒有打印棋,所以對解做一個說明。

比如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]]
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章