程序员面试金典(动态规划):8(n)皇后问题(java解法)

题目描述

请设计一种算法,解决著名的n皇后问题。这里的n皇后问题指在一个nxn的棋盘上放置n个棋子,使得每行每列和每条对角线上都只有一个棋子,求其摆放的方法数。

给定一个int n,请返回方法数,保证n小于等于10


import java.util.*;

public class Queens 
{
    //Solution: 定义一个全局变量sum作为最后的返回值
    //定义一个int[] cols数组用来记录已经访问过列
    //然后逐列进行查找,递归和backtrack。
    public static int sum;
    public int nQueens(int n) 
    {
        sum=0;
        int[] cols=new int[n];
        //cols用来定义已访问过的列
        helper(cols,n,0);
        
        return sum;
    }
  
    private void helper(int[] cols, int n, int row){
        if(row==n){
            sum++;
            return;
        }
        
        for(int i=0;i<n;i++){
            if(isValid(cols,row,i))
            {
                //如果合法,那么继续做下一行
                cols[row]=i;
                helper(cols,n,row+1);
            }
        }
    }
    
    private boolean isValid(int[] cols, int row, int col)
    {
        //定义  isValid 来check是否合法
        for(int i=0;i<row;i++){
            if(cols[i]==col){
                return false;
            }

            if((row-i)==Math.abs(col-cols[i])){
                return false;
            }
        }
        return true;
    }    
}


你可能感兴趣的:(java,动态规划,程序员面试金典)