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.
代码分析:
这题更是典型的回溯算法,主要是加了一个向量用来存各个位置。不管怎样我都觉得回溯算法很神奇。
代码如下:
static int x[1000];
class Solution {
private:
bool Place(int k)
{
for(int i=0;i<k;++i)
{if((abs(i-k)==abs(x[i]-x[k]))||(x[i]==x[k])) return false;}
return true;
}
void Backtrack(int t,int n,vector<string>q,vector< vector<string>>& v1,string s){
if(t==n)
{v1.push_back(q);}
else
{
for(int i=0;i<n;++i)
{
string s1=s;
s1[i]='Q';
q.push_back(s1);
x[t]=i;
if(Place(t)) Backtrack(t+1,n,q,v1,s);
q.pop_back();
}
}
}
public:
vector<vector<string>> solveNQueens(int n) {
vector< vector<string>> v1;
vector<string> q;
string s(n,'.');
for(int i=0;i<n;++i)
{
x[0]=i;
string s1=s;
s1[i]='Q';
q.push_back(s1);
Backtrack(1,n,q,v1,s);
q.pop_back();
}
return v1;
}
};