标签:leetcode
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens‘ placement, where ‘Q‘ and ‘.‘ both indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
Show Tags
这道题是8皇后问题的推广,它推广到了n个皇后问题。但是解题思路还是一样的。
基本思路:
排列的分析见这篇博客。
runtime:92ms
class Solution {
public:
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > result;
vector<int> nums;
for(int i=0;i<n;i++)
nums.push_back(i);
vector<vector<int> > base=permutation(nums);
auto iter1=base.begin();
for(;iter1!=base.end();iter1++)
{
vector<string> vecString;
vector<int> vec=*iter1;
for(int i=0;i<n;i++)
{
string str(n,‘.‘);
str[vec[i]]=‘Q‘;
vecString.push_back(str);
}
result.push_back(vecString);
}
return result;
}
vector<vector<int> > permutation(vector<int> &nums)
{
vector<vector<int> >result;
permutationChild(nums,0,result);
return result;
}
void permutationChild(vector<int> &nums,int offset,vector<vector<int> >&result)
{
if(offset==nums.size()-1)
{
if(judge(nums))
result.push_back(nums);
return;
}
auto base=nums.begin()+offset;
auto iter=base;
for(;iter!=nums.end();iter++)
{
swap(*base,*iter);
permutationChild(nums,offset+1,result);
swap(*base,*iter);
}
}
bool judge(vector<int> & nums)
{
int length=nums.size();
for(int i=0;i<length;i++)
{
for(int j=i+1;j<length;j++)
{
if(abs(i-j)==abs(nums[i]-nums[j]))
return false;
}
}
return true;
}
};
标签:leetcode
原文地址:http://blog.csdn.net/u012501459/article/details/46424133