51. N 皇后

#include <vector>
#include <unordered_set>
#include <string>
#include <iostream>
using namespace std;
class Solution {
public:
    Solution(){}
    ~Solution(){}
    vector<vector<string>> solveNQueens(int n) {
        //存储每一行Quenn的位置
        auto queens=vector<int>(n,-1);
        //返回结果
        auto res=vector<vector<string>>();
        //存储已经被占用的列
        auto col=unordered_set<int>();
        //存储已经被占用的正斜线
        auto dia1=unordered_set<int>();
        //存储已经被占用的反斜线
        auto dia2=unordered_set<int>();
        backtrack(res,queens,col,dia1,dia2,n,0);
        return res;
    }

    void backtrack(vector<vector<string>>&res,vector<int> &queens,unordered_set<int> &col, unordered_set<int> &dia1,unordered_set<int> &dia2,int n ,int row){
        if (row==n)
        {
            vector<string> v=getBoard(queens,n);
            res.push_back(v);
        }else{
            for (int i = 0; i < n; i++)
            {
                //判断当前列是否被占用
                if (col.find(i)!=col.end())
                {
                    continue;
                }
                //判断当前正斜线是否被占用
                int d1=row-i;//正斜线上的元素列与行的差相等
                if (dia1.find(d1)!=dia1.end())
                {
                    continue;
                }
                //判断当前反斜线是否被占用
                int d2=row+i;//反斜线上的元素列与行的和相等
                if (dia2.find(d2)!=dia2.end())
                {
                    continue;
                }
                //存储当前Queen的位置
                queens[row]=i;
                col.insert(i);
                dia1.insert(d1);
                dia2.insert(d2);
                backtrack(res,queens,col,dia1,dia2,n,row+1);
                col.erase(i);
                dia1.erase(d1);
                dia2.erase(d2);
            }
            
        }
        
    }
    //获取每个结果集
    vector<string> getBoard(vector<int> &queens,int n){
        auto v=vector<string>();
        for (int i = 0; i < n; i++)
        {
            string s=string(n,'.');
            //将每一行的Queen放在对应的位置上
            s[queens[i]]='Q';
            v.push_back(s);
        }
        return v;
    }
};
int main(){
    Solution s;
    auto res=vector<vector<string>>();
    res=s.solveNQueens(4);
    int len=res.size();
    for (int i = 0; i < len; i++)
    {
        auto v=res[i];
        for (int j = 0; j < 4; j++)
        {
            cout<<v[j]<<"\n";
        }
        cout<<"\n";
    }
}

 

posted on 2022-11-28 17:39  一仟零一夜丶  阅读(27)  评论(0)    收藏  举报