非常简洁的八皇后问题的递归算法(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]]
 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值