LeetCode 面试题 08.12. 八皇后***

具体思路:

八皇后经典问题,二刷注意一下位计数解法;

主要在于两个对角线如何计算;

左到右的对角线可以直接采用row-col来统计;

右到左的对角线可以通过采用row+col来统计;

具体代码:

1.普通递归解法:

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<bool>>vec(n,vector<bool>(n,true));
        vector<vector<string>> ret;
        vector<bool>col(n,true);
        unordered_set<int>dig1;
        unordered_set<int>dig2;
        dfs(dig1,dig2,ret,vec,col,n,0);
        return ret;
    }

    void dfs(unordered_set<int>& dig1,unordered_set<int>& dig2,vector<vector<string>>& ret,vector<vector<bool>>& vec,vector<bool>& col,int n,int row){
        if(row==n){
            vector<string>temp;
            for(auto& v:vec){
                string s="";
                for(int i=0;i<n;i++){
                    if(v[i]){
                        s.push_back('.');
                    }else{
                        s.push_back('Q');
                    }
                }
                temp.push_back(s);
            }
            ret.push_back(temp);
            return;
        }
        for(int i=0;i<n;i++){
            if(col[i]&&dig1.find(i-row)==dig1.end()&&dig2.find(i+row)==dig2.end()){
                col[i]=false;
                vec[row][i]=false;
                dig1.insert(i-row);
                dig2.insert(i+row);
                dfs(dig1,dig2,ret,vec,col,n,row+1);
                vec[row][i]=true;
                col[i]=true;
                dig1.erase(i-row);
                dig2.erase(i+row);
            }
        }
    }
};

2.位计算解法:

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        auto solutions = vector<vector<string>>();
        auto queens = vector<int>(n, -1);
        solve(solutions, queens, n, 0, 0, 0, 0);
        return solutions;
    }

    void solve(vector<vector<string>> &solutions, vector<int> &queens, int n, int row, int columns, int diagonals1, int diagonals2) {
        if (row == n) {
            auto board = generateBoard(queens, n);
            solutions.push_back(board);
        } else {
            int availablePositions = ((1 << n) - 1) & (~(columns | diagonals1 | diagonals2));
            while (availablePositions != 0) {
                int position = availablePositions & (-availablePositions);
                availablePositions = availablePositions & (availablePositions - 1);
                int column = __builtin_ctz(position);
                queens[row] = column;
                solve(solutions, queens, n, row + 1, columns | position, (diagonals1 | position) >> 1, (diagonals2 | position) << 1);
                queens[row] = -1;
            }
        }
    }

    vector<string> generateBoard(vector<int> &queens, int n) {
        auto board = vector<string>();
        for (int i = 0; i < n; i++) {
            string row = string(n, '.');
            row[queens[i]] = 'Q';
            board.push_back(row);
        }
        return board;
    }
};

你可能感兴趣的:(LeetCode刷题记录,leetcode)