力扣每日一题51:N皇后问题

题目描述:

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

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

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:

力扣每日一题51:N皇后问题_第1张图片

输入:n = 4
输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:[["Q"]]

提示:

  • 1 <= n <= 9

通过次数

341K

提交次数

461.1K

通过率

74.0%

思路和题解:

我们可以用递归的方法依次判断每一行中皇后摆放的位置。然后这一行放完一个皇后之后,就递归调用下一行,只要每次放置皇后的时候保证这个皇后不会被攻击即可。当递归到最后一行是返回摆放皇后的矩阵。本题的难点是判断(row,col)位置的皇后是否被攻击,正常思路是设置一个int矩阵,1表示有皇后,0表示无皇后,然后每次判断米字形(即能攻击到皇后的位置)的上方有没有皇后。但是我们直到,在摆放的过程中,一行只有一个皇后,也就输矩阵的一行只有一个1,其他都是0,所以我们只需要一个一维数组存放皇后在对应行的列数即可。

通过代码:

class Solution {
public:
    int queen[10];//每一行皇后的位置
    bool attacked(int row,int col)
    {//判断是否被攻击
        for(int i=0;i> &ans)
    {
        if(row==n)
        {//新的解法
            vector mat;
            for(int i=0;i> solveNQueens(int n) {
        memset(queen,0,sizeof(queen));
        vector> ans;
        findspace(0,n,ans);
        return ans;
    }
};

你可能感兴趣的:(LeetCode每日一题,leetcode,算法,职场和发展)