Problem:
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.."] ]
Analysis:
Solutions:
C++:
bool IsSafeLean(int row, int col, vector<int> seizedColumns, int row_bound)
{
for(int i = 1; row - i >= 0 && col + i < row_bound; ++i) {
if(seizedColumns[row - i] == col + i)
return false;
}
for(int i = 1; row - i >= 0 && col - i >= 0; ++i) {
if(seizedColumns[row - i] == col - i)
return false;
}
return true;
}
void FindPlacements(vector<int> seizedColumns, int row, int row_bound, vector<vector<string> >& sols) {
if(row == row_bound) {
vector<string> placement;
for(int i = 0; i < seizedColumns.size(); ++i) {
string row = "";
for(int j = 0; j < row_bound; ++j) {
if(j == seizedColumns[i])
row.push_back('Q');
else
row.push_back('.');
}
placement.push_back(row);
}
sols.push_back(placement);
} else {
for(int col = 0; col < row_bound; ++col) {
if(!seizedColumns.empty()) {
int index = 0;
for(; index < seizedColumns.size(); ++index) {
if(col == seizedColumns[index])
break;
}
if(index < seizedColumns.size() || (index == seizedColumns.size() && !IsSafeLean(row, col, seizedColumns, row_bound)))
continue;
}
seizedColumns.push_back(col);
FindPlacements(seizedColumns, row + 1, row_bound, sols);
seizedColumns.erase(seizedColumns.end() - 1);
}
}
}
vector<vector<string> > solveNQueens(int n) {
vector<vector<string> > sols;
vector<int> seizedColumns;
FindPlacements(seizedColumns, 0, n, sols);
return sols;
}
Java
:
Python: