LeetCode 51. N 皇后--dfs

  1. N 皇后

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

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

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

示例 1:
LeetCode 51. N 皇后--dfs_第1张图片

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

示例 2:

输入:n = 1
输出:[[“Q”]]

提示:

1 <= n <= 9
皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

题解

可以通过,映射坐标快速判断某行或某列或斜角线是否被占用。

AC代码

class Solution {
public:
    bool col[10],row[10],bias1[30],bias2[30];
    vector<vector<string>>res;
    
    void dfs(int dp,int n,vector<string>q)
    {
        if(dp>=n)
        {
            res.push_back(q);
            return ;
        }
        for(int i=0;i<n;i++)
        {
            int bias1_pos = i-dp+n;
            int bias2_pos = i+dp+n;
            if(col[i]||bias1[bias1_pos]||bias2[bias2_pos])continue;
            col[i]=true;
            bias1[bias1_pos]=true;
            bias2[bias2_pos]=true;
            string s;
            for(int j=0;j<n;j++)
            {
                s+=".";
            }
            s[i]='Q';
            q.push_back(s);
            dfs(dp+1,n,q);
            col[i]=false;
            bias1[bias1_pos]=false;
            bias2[bias2_pos]=false;
            q.pop_back();
        }
    }
    
    vector<vector<string>> solveNQueens(int n) 
    {
        memset(col,0,sizeof(col));
        memset(row,0,sizeof(row));
        memset(bias1,0,sizeof(bias1));
        memset(bias2,0,sizeof(bias2));
        vector<string>q;
        dfs(0,n,q);
        return res;
    }
};

LeetCode 51. N 皇后--dfs_第2张图片

你可能感兴趣的:(LeetCode,简单搜索,leetcode,算法,动态规划)