码迷,mamicode.com
首页 > 其他好文 > 详细

N皇后问题——递归求解

时间:2015-09-23 15:03:59      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:

比较简单,废话不说,上代码:

public class NQueen {
    //比如:position[1]=3,表示第一行的第三列有一个皇后
    private int [] position;
    //总的方法数量
    private int total;
    private int numOfQueens;
    public NQueen(int n) throws Exception
    {
        if(n<0)
            throw new Exception("can not be negative...");
        else
        {
            //position[0]不用
            position= new int[n+1];
            numOfQueens = n;
            total = 0;
        }
            
    }
    public int nQueen()
    {
        putQueen(1);
        return total;
    }
    //在第row行放一个queen
    private void putQueen(int row)
    {
        if(row==numOfQueens+1)
        {
            total++;
            return;
        }
        //遍历第row行放置皇后的所有的可能性
        for(int i=1;i<=numOfQueens;i++)
        {
            position[row]=i;
            //如果放的合理
            if(checkIfValid(row))
                putQueen(row+1);//则递归求解
        }
    }
    //检查放的是否合理
    private boolean checkIfValid(int row)
    {
        if(row==1)
            return true;
        for(int i=1;i<row;i++)
        {
            if(!check(i,row))
                return false;
        }
        return true;
    }
    private boolean check(int a,int b)
    {
        if(position[a]==position[b] || 
                (a-b)==(position[a]-position[b]) ||
                        (a-b)==-1*(position[a]-position[b])) 
            return false;
        return true;
    }
    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        NQueen nq = new NQueen(8);
        System.out.println(nq.nQueen());
        // TODO Auto-generated method stub

    }

}

 

N皇后问题——递归求解

标签:

原文地址:http://www.cnblogs.com/wzm-xu/p/4832170.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!