51. N-Queens

来源:互联网 发布:如何正确对待人工智能 编辑:程序博客网 时间:2024/06/05 09:14

经典的回溯方法。

想方法不难,但是注意isValid函数,一开始我的做法是一行一列两个斜线都判断是否有冲突的Q,但是超时了,看了别人的代码才发现,只需要算这个位置上面的位置,这个位置与左上角的斜线,这个位置和右上角的斜线是否有冲突的就行了。这一行下面的都还没有遍历到,当然不会有冲突的Q。还有push_back到res之后要return,不要忘了写。

class Solution {public:    vector<vector<string>> solveNQueens(int n) {        vector<vector<string>> res;        vector<string> v(n, string(n, '.'));        helper(res, v, n, 0);        return res;    }    void helper(vector<vector<string>>& res, vector<string>& v, int n, int i){        if(i >= n)  {            res.push_back(v);            return;        }        for(int j = 0; j < n; ++j){            v[i][j] = 'Q';            if(isValid(v, n, i, j) == true){                helper(res, v, n, i+1);            }            v[i][j] = '.';        }    }    bool isValid(vector<string>& v, int n, int row, int col){        //check if the column had a queen before.        for (int i = 0; i != row; ++i)            if (v[i][col] == 'Q')                return false;        //check if the 45° diagonal had a queen before.        for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; --i, --j)            if (v[i][j] == 'Q')                return false;        //check if the 135° diagonal had a queen before.        for (int i = row - 1, j = col + 1; i >= 0 && j < n; --i, ++j)            if (v[i][j] == 'Q')                return false;        return true;    }};


原创粉丝点击