class Solution {
//using DFS
//CheckPosition part may can be optimized
public:
vector<vector<string> > solveNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(0 == n) return vector<vector<string> >();
string emptyStr(n, '.');
vector<vector<string> > ans;
vector<string> path(n, emptyStr);
vector<bool> colOccupied(n, false);
solveNQueens_aux(n, 0, colOccupied, path, ans);
return ans;
}
void solveNQueens_aux( int n, int row, vector<bool>& colOccupied, vector<string>& path, vector<vector<string> >& ans )
{
//throw std::exception("The method or operation is not implemented.");
if(row == n)
{
ans.push_back(path);
return;
}
for (int i = 0; i < n; ++i)
{
if (false == colOccupied[i] && CheckPosition(path, row, i))
{
colOccupied[i] = true;
path[row][i] = 'Q';
solveNQueens_aux(n, row+1, colOccupied, path, ans);
colOccupied[i] = false;
path[row][i] = '.';
}
}
}
bool CheckPosition( vector<string>& path, int row, int col )
{
//throw std::exception("The method or operation is not implemented.");
int right = col;
int step = 0;
int n = path.size();
while (true)
{
int nowRow = row-step;
int rightCol = col+step;
int leftCol = col-step;
if(nowRow < 0) return true;
if(rightCol < n && path[nowRow][rightCol] == 'Q')
return false;
if (leftCol >= 0 && path[nowRow][leftCol] == 'Q')
return false;
step++;
}
}
};
second time
class Solution {
public:
bool checkBoard(int curRow, vector<int>& path)
{
for(int i = 0; i < curRow; ++i)
{
int num1 = path[i];
int num2 = path[curRow];
if(num2&num1 || num2&num1<<(curRow-i) || num2&num1>>(curRow-i)) return false;
}
return true;
}
vector<string> convert2Board(int n, vector<int>& curPath)
{
map<int, int> posMap;
for(int i = 0; i < n; ++i) posMap[1<<i] = n-1-i;
vector<string> str(n);
for(int i = 0; i < n; ++i)
{
str[i].resize(n, '.');
int pos = posMap[curPath[i]];
str[i][pos] = 'Q';
}
return str;
}
void solveNQueensUtil(int n, int curRow, vector<int>& curPath, vector<vector<string> >& allPath)
{
if(curRow == n)
{
vector<string> curBoard = convert2Board(n, curPath);
allPath.push_back(curBoard);
}
for(int j = 0; j < n; ++j)
{
int curNum = 1<<j;
curPath.push_back(curNum);
if(checkBoard(curRow, curPath)) solveNQueensUtil(n, curRow+1, curPath, allPath);
curPath.pop_back();
}
}
vector<vector<string> > solveNQueens(int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
vector<vector<string> > allPath;
vector<int> curPath;
solveNQueensUtil(n, 0, curPath, allPath);
return allPath;
}
};