题目如下图:
递归版
classSolution {public:
vector> solveNQueens(intn) {
vector dict(n, 0);
dfs(0, dict, n);returnres;
}private:void dfs(int cur, vector & dict, intn)
{if (cur ==n)
{
fillRes(dict);return;
}for (int i = 0; i < n; i++)
{
dict[cur]=i;if(check(dict, cur))
dfs(cur+ 1, dict, n);
}
}void fillRes(vector &dict)
{
vectortmp;for (int i = 0; i < dict.size(); i++)
{string s(dict.size(), '.');
s[dict[i]]= 'Q';
tmp.push_back(s);
}
res.push_back(tmp);
}bool check(vector & dict, intcur)
{for (int i = 0; i < cur; i++)
{if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur -i))return false;
}return true;
}
vector>res;
};
迭代版
class Solution {
public:
vector> solveNQueens(int n) {
vector> res;
vector nums(n, 0);
int cur = 0;
while (cur >= 0)
{
if (check(nums, cur))
cur = cur + 1;
else
{
int carry = 1;
for (; cur >= 0 && carry != 0;)
{
nums[cur] += carry;
if (nums[cur] == n)
{
nums[cur--] = 0;
carry = 1;
}
else
{
carry = 0;
}
}
}
if (cur == n)
{
fillRes(res, nums);
int carry = 1;
for (cur--; cur >= 0 && carry != 0;)
{
nums[cur] += carry;
if (nums[cur] == n)
{
nums[cur--] = 0;
carry = 1;
}
else
{
carry = 0;
}
}
}
}
return res;
}
private:
void fillRes(vector> & res, vector & dict)
{
vector tmp;
for (int i = 0; i < dict.size(); i++)
{
string s(dict.size(), '.');
s[dict[i]] = 'Q';
tmp.push_back(s);
}
res.push_back(tmp);
}
bool check(vector & dict, int cur)
{
for (int i = 0; i < cur; i++)
{
if (dict[i] == dict[cur] || abs(dict[cur] - dict[i]) == abs(cur - i))
return false;
}
return true;
}
};