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,
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]
There exist two distinct solutions to the 4-queens puzzle:
class Solution {
public:
bool isValid(vector<string>& svec, int i, int j, int n)
{
for(int h = 0; h < j; ++h)
{
if(svec[i][h] == 'Q')
{
return false;
}
}
for(int k = 0; k < i; ++k)
{
if(svec[k][j] == 'Q')
{
return false;
}
}
int k = i - 1, h = j - 1;
while(k >= 0 && h >= 0)
{
if(svec[k][h] == 'Q')
{
return false;
}
k--;
h--;
}
k = i + 1;
h = j + 1;
while(k < n && h < n)
{
if(svec[k][h] == 'Q')
{
return false;
}
++k;
++h;
}
k = i - 1, h = j + 1;
while(k >= 0 && h < n)
{
if(svec[k][h] == 'Q')
{
return false;
}
--k;
h++;
}
k = i + 1, h = j - 1;
while(k < n && h >= 0)
{
if(svec[k][h] == 'Q')
{
return false;
}
++k;
--h;
}
return true;
}
void help(vector<vector<string> >& vsvec, vector<string>& svec, int dep, int n)
{
if(dep == n)
{
vsvec.push_back(svec);
return;
}
for(int i = 0; i < n; ++i)
{
if(isValid(svec, i, dep, n))
{
svec[i][dep] = 'Q';
help(vsvec, svec, dep + 1, n);
svec[i][dep] = '.';
}
}
}
vector<vector<string> > solveNQueens(int n)
{
vector<vector<string> > vsvec;
if(n <= 0)
{
return vsvec;
}
string s = "";
for(int i = 0; i < n; ++i)
{
s += '.';
}
vector<string> svec(n, s);
help(vsvec, svec, 0, n);
return vsvec;
}
};