51. N Queen/52. N Queen II

2020-07-29

1. Title description

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

2. Problem solution

回溯算法

3. Code

class Solution {
    
    
public:
    vector<vector<string>> solveNQueens(int n) {
    
    
        if (n==0) return vector<vector<string>>(0);
        vector<bool> colum(n,false);
        vector<bool> f1(2*n,false); // 主对角线
        vector<bool> f2(2*n,false); // 副对角线
        string s;
        for (int i=0;i<n;i++) s.push_back('.');
        vector<string> vec;
        for (int i=0;i<n;i++){
    
    
            vec.push_back(s);
        }
        dfs(0,n,vec,colum,f1,f2);
        return res;
    }

    bool isvalid(int x,int y,int n,vector<bool> colum,vector<bool> f1,vector<bool> f2){
    
    
        if (colum[y]||f1[x-y+n-1]||f2[x+y]) return false;
        return true;
    }

    void dfs(int x,int n,vector<string> vec,vector<bool> colum,vector<bool> f1,vector<bool> f2){
    
    
        if (x==n){
    
    
            res.push_back(vec);
            return ;
        }
        for (int y=0;y<n;y++){
    
    
            if (isvalid(x,y,n,colum,f1,f2)){
    
    
                colum[y]=true;
                f1[x-y+n-1]=true;
                f2[x+y]=true;
                vec[x][y]='Q';
                dfs(x+1,n,vec,colum,f1,f2);
                colum[y]=false;
                f1[x-y+n-1]=false;
                f2[x+y]=false;
                vec[x][y]='.';
            }
        }
    }

    vector<vector<string>> res;
};
class Solution {
    
    
public:
    int totalNQueens(int n) {
    
    
        if (n==0) return 0;
        vector<bool> colum(n,false);
        vector<bool> f1(2*n,false); // 主对角线
        vector<bool> f2(2*n,false); // 副对角线
        res=0;
        dfs(0,n,colum,f1,f2);
        return res;
    }

    bool isvalid(int x,int y,int n,vector<bool> colum,vector<bool> f1,vector<bool> f2){
    
    
        if (colum[y]||f1[x-y+n-1]||f2[x+y]) return false;
        return true;
    }

    void dfs(int x,int n,vector<bool> colum,vector<bool> f1,vector<bool> f2){
    
    
        if (x==n){
    
    
            res++;
            return ;
        }
        for (int y=0;y<n;y++){
    
    
            if (isvalid(x,y,n,colum,f1,f2)){
    
    
                colum[y]=true;
                f1[x-y+n-1]=true;
                f2[x+y]=true;
                dfs(x+1,n,colum,f1,f2);
                colum[y]=false;
                f1[x-y+n-1]=false;
                f2[x+y]=false;
            }
        }
    }

    int res;
};

Guess you like

Origin blog.csdn.net/qq_34600424/article/details/107653905