N-Queens

来源:互联网 发布:学生网络诈骗事例 编辑:程序博客网 时间:2024/06/06 09:58

1.题目

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

对于4皇后问题存在两种解决的方案:

[

    [".Q..", // Solution 1

     "...Q",

     "Q...",

     "..Q."],

    ["..Q.", // Solution 2

     "Q...",

     "...Q",

     ".Q.."]

]

2.算法

这个问题是典型的NP问题,用一个循环递归处理子问题。这个问题中,在每一层递归函数中,我们用一个循环把一个皇后填入对应行的某一列中,如果当前棋盘合法,我们就递归处理下一行,找到正确的棋盘我们就存储到结果集里面。用一个循环去枚举当前所有情况,然后把元素加入,递归,再把元素移除,这道题目中不用移除的原因是我们用一个一维数组去存皇后在对应行的哪一列,因为一行只能有一个皇后,如果二维数组,那么就需要把那一行那一列在递归结束后设回没有皇后,所以道理是一样的。

    ArrayList<ArrayList<String>> solveNQueens(int n)     {        // write your code here        ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();        helper(n, 0, new int[n], res);        return res;    }    public void helper(int n, int row, int[] col, ArrayList<ArrayList<String>> res)    {        if (row == n)        {            ArrayList<String> item = new ArrayList<String>();            for (int i = 0; i < n; i++)            {                StringBuilder sb = new StringBuilder();                for (int j = 0; j < n; j++)                {                    if (col[i] == j)                    {                        sb.append("Q");                    }                    else                    {                        sb.append(".");                    }                }                item.add(sb.toString());            }            res.add(item);            return;        }        for (int i = 0; i < n; i++)        {            col[row] = i;            if (check(row, col))            {               helper(n,row+1,col,res);            }        }    }    public boolean check(int row, int[] col)    {        for (int i = 0; i < row; i ++)        {            if (col[i] == col[row] || Math.abs(col[i] - col[row]) == row - i)            {                return false;            }        }        return true;    }

这道题是np问题,基本思路如下,

用一个递归找每行中符合条件的,在递归下一行,到最后一行后存储,并返回,

0 0
原创粉丝点击