您的位置:首页 > 产品设计 > UI/UE

LeetCode第51题之 N-Queens

2016-06-25 13:09 435 查看
思路主要是参考我以前的一篇博客: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode