【算法设计与分析】n后问题

问题描述:

         在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或 同一列或同一斜线上。

  

package edu.xalead;

public class n后问题 {

    static int n;          //皇后个数
    static int[] x;        //当前解
    static long sum;       //当前已找到的可行方案数

    public static long nQueen(int nn){
        n = nn;
        sum = 0;
        x = new int[n+1];
        for(int i=0;i<=n;i++) x[i] =0;
        backtrack();
        return sum;

    }

    private static boolean place(int k){//检查第k行的可行性
        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;//说明符合条件
    }

    private static void backtrack() {  //递归方法
        x[1] = 0;
        int k=1;
        while(k>0){
            x[k]+=1;
            while((x[k]<=n&&!(place(k)))) x[k]+=1;//不符合条件就一直右移一列
            if(x[k]<=n) //没有出界
                if(k==n) sum++;   //抵达最后一行,即到达叶子节点 ,可行方案数+1
                else{
                    k++;             //下移一行
                    x[k] = 0;       //将初值赋值为0
                }
                else k--;     //说明这个方法行不通,向上退一行
        }
    }

    public static void main(String[] args) {
        n后问题 q = new n后问题();

        System.out.println("该皇后的解决方案有" + q.nQueen(8) + "种");
    }
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值