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

java实现N皇后递归算法

2014-12-02 22:32 204 查看
这里是N皇后实现递归算法的java实现:

package NQueensDG;

import java.util.Scanner;

public class NQUEENSDIGUI {

/**
* @author YuYunTan(谭淇蔚)
*
*N 皇后问题:
*在一个 N * N 的国际象棋棋盘中,
*怎样放置 N 个皇后才能使 N 个皇后之间不会互相有威胁而共同存在于棋局中,
*即在 N * N 个格子的棋盘中没有任何两个皇后是在同一行、同一列、同一斜线上。
*
*下面是递归的回溯法
*递归方法backtrack(1)实现对整个解空间的回溯搜索
*backtrack(i)搜索解空间中第i层子树。
*类NQUEENSDIGUI的数据成员记录解空间中的结点信息,以减少窗格backtrack的参数。sum记录可行解的 方案数
*
*/
//------------------------------------------------------------
//下面是数据成员--------------------------------------------------
static int n;//皇后个数
static int []x;//当前解
static long sum;

//成员定义结束----------------------------------------------------

NQUEENSDIGUI(int nn){
n =nn;
sum =0;
x = new int [n+1];
for(int i=0;i <= n ;i++)x[i]=0;//初始化都为0
backtrack(1);
}

private void backtrack(int t) {
// TODO 自动生成的方法存根
if(t > n){
sum++;
print(x);
}
else
for(int i=1;i<=n;i++){
x[t]=i;
if(place(t))backtrack(t+1);//递归调用,循环求解
}
}

private void print(int[] x2) {
// TODO 自动生成的方法存根
System.out.println((x2.length-1)+"皇后的解为:");
for(int i=1;i<=n;i++){
System.out.print(" "+x2[i]);
}
System.out.println("");
}

private boolean place(int k) {
// TODO 自动生成的方法存根
for(int j=1;j < k;j++){
if((Math.abs(k-j) == Math.abs(x[j]-x[k]))||(x[j] == x[k]))return false;
}
return true;
}

public static void main(String[] args) {
int s;
Scanner input = new Scanner(System.in);
s = input.nextInt();
NQUEENSDIGUI a = new NQUEENSDIGUI(s);
System.out.println("---------------------------------");
System.out.println("华丽丽的"+s+"皇后问题解");
System.out.println(s+"皇后一共有"+sum+"个解!");
input.close();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: