题目:
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.."] ]
思路:
经典的“八皇后问题”简直就是为回溯法而生。为了提高运行效率,我们在DFS的内部实现了安全性检查:即在搜索进行到第k层的第i个位置时,我们检查它所在的列是否安全;所在的对角线是否安全,以及所在的反对角线是否安全。如果这三个地方都是安全的,则试图在该位置放置一个皇后,然后接着搜索下一层。搜索完成之后一定要回溯,才能保证找到所有满足条件的解。
代码:
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> ret;
if(n <= 0)
return ret;
vector<string> map(n, string(n, '.')); // initialize the chess
DFS(map, ret, 0, n);
return ret;
}
private:
void DFS(vector<string>& map, vector<vector<string>> &ret, int k, int n)
{
if(n == k)
return ret.push_back(map);
for(int i = 0; i < n; ++i)
{
int x, y;
for(y = 0; y < k; y++)
if(map[y][i] == 'Q') // the y-th row is not safe
break;
if(y != k)
continue;
for(x = i, y = k; x < n && y >= 0; x++, y--)
if(map[y][x] == 'Q') // the counter-diagonal is not safe
break;
if(!(x == n || y < 0))
continue;
for(x = i, y = k;x >= 0 && y >= 0; x--, y--)
if(map[y][x] == 'Q') // the diagonal is not safe
break;
if(!(x < 0 || y < 0))
continue;
map[k][i] = 'Q';
DFS(map, ret, k + 1, n);
map[k][i] = '.'; // backtracking
}
}
};