题目:
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.."]
]
分析:
这个问题用到回溯递归。
想不出来,只好参考别人的代码~~~
下面就写一下对别人代码的分析吧:
方法的核心是每次确定第i行的Queen位置
pos 存储的是第i行的Q所在的位置
具体的还是看代码注释吧···················
实现:
class Solution {
public:
vector<vector<string>> solveNQueens(int n) {
//res 用来存储result
vector<vector<string>> res;
//pos 用来存储第i个Queen所在的位置
vector<int> pos(n, -1);
solveNQueenDFS(pos, 0, res);
return res;
}
void solveNQueenDFS(vector<int>& pos, int row, vector<vector<string>>& res)
{
int n = pos.size();
if (row == n)
{
// 如果行数row == n
//则说明这种情况下的pos已经确定
//于是构造out,注意out的构造方法,非常简洁
vector<string> out(n, string(n, '.'));
for (int i = 0; i < n; i++)
out[i][pos[i]] = 'Q';
res.push_back(out);
}
else
{
for (int col = 0; col < n; col++)
{
// 针对某一行row ,检查每一列是否满足条件
//如果满足条件就可以row++,找下一行的合理位置
if (isValid(pos, row, col))
{
pos[row] = col;
solveNQueenDFS(pos, row + 1, res);
}
}
}
}
bool isValid(vector<int> pos, int row, int col)
{
for (int i = 0; i < row; i++)
{
//如果之前的row中,当前列已经存在Q了,那就是invalid
// 判断对角线是否合法
if (col == pos[i] || abs(row - i) == abs(col - pos[i]))
return false;
}
return true;
}
};