分治法实现 n皇后问题 Java语言

package n皇后问题;

import java.util.Arrays;

/*
 * n皇后问题:
 * 		在一个n * n的国际象棋盘上放置n个皇后 ,使得这n个皇后不在同一行同一列,同一对角线上 求复合的方案数量
 * 设计思路:
 * 		因为皇后不能同一行和同一列,所以每一行和每一列只能放置一个皇后
 * 		可以用把 1-n列的皇后所在的行号写出(从小到大) 就类似与将行号排列组合  也就是 1-n排列组合
 * 		再筛选出不对角线的
 */
class GenerateP{
	
	private int count;
	private int n;  //  当前国际象棋盘为n * n  放置n个皇后  
	private final int maxn = 110;//最多棋盘可为 maxn * maxn
	private boolean [] hashTable;
	private int [] p;
	
	public GenerateP(int n) {
		// TODO Auto-generated constructor stub
		this.n = n;
		hashTable = new boolean[maxn];
		p = new int [maxn];
		Arrays.fill(hashTable, false);
		Arrays.fill(p, 0);
		count = 0;
	}
	public void generatep(int index){
		if(index == n + 1){
			boolean flag = true;
			for(int i = 1; i <= n ;i++){
				for(int j = i + 1; j <= n ;j++){
					if(Math.abs(i - j) == Math.abs(p[i] - p[j])){
						flag = false;
						break;
					}
				}
			}
			if(flag){
				count++;
			}
			return;
		}
		
		
		for(int x = 1; x <= n; x++){
			if(hashTable[x] == false){
				p[index] = x;
 				hashTable[x] = true;
				generatep(index + 1);
				hashTable[x] = false;
			}
		}
	}
	
	public int getCount(){
		return this.count;
	}
}
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		GenerateP generateP = new GenerateP(8);
		generateP.generatep(1);
		System.out.println(generateP.getCount());
	}

}

  

posted @ 2016-09-23 10:36  墨染三秋丶  阅读(513)  评论(0编辑  收藏  举报