n皇后 dfs解法

来源:互联网 发布:青铜卡尺 知乎 编辑:程序博客网 时间:2024/05/29 13:22
#include <iostream>#include <vector>#include <string>using namespace std;class Solution {private:    int **mat;    int limit;    vector<vector<string>> res;    void init(int n){        mat = new int*[n];        for (int i = 0; i < n; ++i){            mat[i] = new int[n];        }        for (int i = 0; i < n; ++i){            for (int j = 0; j < n; ++j){                mat[i][j] = 0;            }        }        limit = n;    }    bool check(int row, int col){        for (int i = 0; i < row; ++i){            if (mat[i][col])//不能同列                return false;            for (int j = 0; j < limit; ++j){                if (mat[i][j]){                    if (abs(i - row) == abs(j - col))//不能在对角线上                        return false;                    else                        break;                }            }        }        return true;    }    void dfs(int row){        if (row >= limit){            vector<string> temp;            for (int i = 0; i < limit; ++i){                temp.push_back(string(limit, '.'));                for (int j = 0; j < limit; ++j){                    if (mat[i][j])                        temp[i][j] = 'Q';                }            }            res.push_back(temp);        }        for (int col = 0; col < limit; ++col){            if (check(row, col)){                mat[row][col] = 1;                dfs(row + 1);                mat[row][col] = 0;            }        }    }public:    vector<vector<string>> solveNQueens(int n) {        init(n);        dfs(0);        return res;    }};int main(){    Solution sol;    vector<vector<string>> res = sol.solveNQueens(8);    for (int i = 0; i < res.size(); ++i){        //vector<string> temp = res[i];        for (int j = 0; j < res[i].size(); ++j){            cout << res[i][j] << endl;        }        cout << endl;    }}
0 0