您的位置:首页 > 编程语言 > Java开发

java分治算法实现n皇后问题

2016-10-22 10:47 369 查看
package com.company.Puzzal;

/**
* Created by likailong on 2016/10/22.
*/
import java.util.Arrays;

/*
* n皇后问题:
*      在一个n * n的国际象棋盘上放置n个皇后 ,使得这n个皇后不在同一行同一列,同一对角线上 求复合的方案数量
*      因为皇后不能同一行和同一列,所以每一行和每一列只能放置一个皇后
*      可以用把 1-n列的皇后所在的行号写出(从小到大) 就类似与将行号排列组合  也就是 1-n排列组合
*      再筛选出不对角线的
*/
class Generate{
private int count;
private int n;  //  当前国际象棋盘为n * n  放置n个皇后
private final int maxn = 110;//最多棋盘可为 maxn * maxn
private boolean [] hashTable;
private int [] p;
public Generate(int n) {//构造方法
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 Queen {
public static void main(String[] args) {
// TODO Auto-generated method stub
Generate generateP = new Generate(8);
generateP.generatep(1);
System.out.println(generateP.getCount());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: