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

来源:互联网 发布:windows xp系统重装 编辑:程序博客网 时间:2024/06/10 07:17

题目描述

请设计一种算法,解决著名的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;    }    }


0 0
原创粉丝点击