题目:N皇后
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.
Example:
Input: 4
Output: [
[".Q..", // Solution 1
"...Q",
"Q...",
"..Q."],
["..Q.", // Solution 2
"Q...",
"...Q",
".Q.."]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
采用回溯法,DFS,每次加深一行,candidate为改行的每个列;
每个位置的约束条件为 px != x && py = y && abs(px - x) != abs(py - y) ,(px,py)表示,已经放置皇后的位置,表示不能同行,同列,同斜线
结果的构造也比较复杂,vector<vector<string> >, 详见代码:
class Solution {
public:
bool isValidQueen(vector<pair<int,int> > &QueenPos, int x, int y)
{
for(auto e : QueenPos)
{
int px = e.first;
int py = e.second;
if(px == x || py == y || abs(px - x) == abs(py - y))
return false;
}
return true;
}
void dfs(vector<vector<pair<int,int> > >&res,vector<pair<int,int> >&queenPos,int row,int n)
{
if(row >= n )
{
if(row == n)
res.push_back(queenPos);
return;
}
for(int j = 0; j < n; j++)
{
if(true == isValidQueen(queenPos,row,j))
{
queenPos.push_back(make_pair(row,j));
dfs(res,queenPos,row + 1,n);
queenPos.pop_back();
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<pair<int,int> > queenPos;
vector<vector<pair<int,int> > > res;
int row = 0;
queenPos.clear();
dfs(res,queenPos,row,n);
vector<vector<string> > ans;
for(auto e: res)
{
vector<string> str1(n,string(n,'.'));
for(auto pos: e)
{
str1[pos.first][pos.second] = 'Q' ;
}
ans.push_back(str1);
}
return ans;
}
};