LeetCode第51题之 N-Queens

来源:互联网 发布:入骨相思知不知剧透 编辑:程序博客网 时间:2024/06/08 08:31

思路主要是参考我以前的一篇博客:8皇后问题的两种解法,那篇博客思路写的还比较详细,建议看那篇博客。这里我只用第一种解法实现该题。
下面给出C++源代码:

#include <iostream>#include <string>#include <vector>using namespace std;class Solution {public:    //检查在第k个位置的皇后是否与前k-1个皇后冲突    bool check(vector<int> &v, int k)    {        for (int i=0;i<k;++i)        {            if (v[k] == v[i] || abs(v[i]-v[k]) == abs(i-k))            {                return true;            }        }        return false;    }    //    void backdate(vector<int> &v,int n, int k, vector<vector<string>> &res)    {        for (int i=0;i<n;++i)        {            //第k行放第i个皇后            v[k] = i;            //如果没有冲突            if (!check(v, k))            {                if(n-1 == k)                {                    //保存结果                    vector<string> method;                    string s_tmp(n, '.');                    for (int i=0;i<n;++i)                    {                        //将皇后所在的位置‘Q’                        s_tmp[v[i]] = 'Q';                        method.push_back(s_tmp);                        //重新复位                        s_tmp[v[i]] = '.';                    }                    res.push_back(method);                    break;                }                else                {                    //递归                    backdate(v, n, k+1, res);                }            }           }        //如果有冲突,或者回溯回来时        v[k] = -1;    }    vector<vector<string>> solveNQueens(int n) {        //res保存结果        vector<vector<string>> res;        //v[i]表示第i行放第v[i]个位置放皇后        vector<int> v(n, -1);        backdate(v, n, 0, res);        return res;    }};int main(){    Solution s;    vector<vector<string>> res = s.solveNQueens(5);    for (vector<vector<string>>::iterator ita=res.begin();ita!=res.end();++ita)    {        for (vector<string>::iterator itb=ita->begin();itb!=ita->end();++itb)        {            cout<<*itb<<endl;        }        cout<<endl;    }    return 0;}
0 0