51. N-Queens

来源:互联网 发布:盒子设计软件绿色版 编辑:程序博客网 时间:2024/06/07 18:57

1刷
练手神题!!!无数小细节,就是普通的八皇后问题
Ps1vectorntemp;
vector

class Solution {public:    vector<string>ntemp;    vector<vector<int> >visit;    vector<vector<string> >outcome;    int temp = 0;    void changevisit0(int a, int b, int n){        for(int i = 0; i < n; ++ i){            visit[a][i] --;            visit[i][b] --;        }        visit[a][b]++;        for(int i = 1; a + i < n && b + i < n; ++ i)            visit[a + i][b + i] --;        for(int i = 1; a - i >= 0 && b - i >= 0; ++i)            visit[a - i][b - i] --;        for(int i = 1; a - i >= 0 && b + i < n; ++ i)            visit[a - i][b + i] --;        for(int i = 1; a + i < n && b - i >= 0; ++ i)            visit[a + i][b - i] --;    }    void changevisit1(int a, int b, int n){        for(int i = 0; i < n; ++ i){            visit[a][i] ++;            visit[i][b] ++;        }        visit[a][b]--;        for(int i = 1; a + i < n && b + i < n; ++ i)            visit[a + i][b + i] ++;        for(int i = 1; a - i >= 0 && b - i >= 0; ++i)            visit[a - i][b - i] ++;        for(int i = 1; a - i >= 0 && b + i < n; ++ i)            visit[a - i][b + i] ++;        for(int i = 1; a + i < n && b - i >= 0; ++ i)            visit[a + i][b - i] ++;    }    void dfs(int a, int b, int n, int num){        if(a == n)            return ;        ntemp[a][b] = 'Q';        changevisit1(a, b, n);        if(num + 1 == n){            outcome.push_back(ntemp);            temp++;        }        else         for(int i = 0; i < n; ++ i)            if(visit[a + 1][i] == 0)            dfs(a + 1, i, n, num + 1);        ntemp[a][b] = '.';        changevisit0(a, b, n);        return ;    }    vector<vector<string>> solveNQueens(int n) {        string s = "";        for(int i = 0; i < n; ++ i)            s += ".";        for(int i = 0; i < n; ++ i)            ntemp.push_back(s);        vector<int>u;        for(int i = 0; i < n; ++ i)            u.push_back(0);        for(int i = 0; i < n; ++ i)            visit.push_back(u);        for(int i = 0; i < n; ++ i){            dfs(0, i, n, 0);            for(int j = 0; j < n; ++ j)                for(int k = 0; k < n; ++ k){                    visit[j][k] = 0;                    ntemp[j][k] = '.';                }        }        return outcome;    }};

2刷
学习了一个比1刷还要简洁的方法,就是dfs的时候for行,这个样子就不用判断每一行,因为每一行一定只有一个数,只需要判断列,45度的斜和135度的斜,所以开了一个flag数组
flag[0] to flag[n - 1] to indicate if the column had a queen before.
flag[n] to flag[3 * n - 2] to indicate if the 45° diagonal had a queen before.
flag[3 * n - 1] to flag[5 * n - 3] to indicate if the 135° diagonal had a queen before.

容易理解!!!代码短不容易出错!!!比1刷好太多了!!dfs也是练手的好题!

class Solution {public:    void solve(vector<vector<string>>& ve, vector<string>& vec, vector<int>& flag, int row, int n){        if(row == n){            ve.push_back(vec);            return ;        }        for(int i = 0; i < n; ++i)            if(flag[i] && flag[n + row + i] && flag[4 * n - 2 + i - row]){                flag[i] = flag[n + row + i] = flag[4 * n - 2 + i - row] = 0;                vec[row][i] = 'Q';                solve(ve, vec, flag, row + 1, n);                vec[row][i] = '.';                flag[i] = flag[n + row + i] = flag[4 * n - 2 + i - row] = 1;            }    }    vector<vector<string>> solveNQueens(int n) {        vector<vector<string>>ve;        vector<string>vec(n, string(n, '.'));        vector<int>flag(5 * n - 2, 1);        solve(ve, vec, flag, 0, n);        return ve;    }};
0 0
原创粉丝点击