在二维的数组下进行搜索
其实感觉也差不多
for循环是遍历 col
递归是遍历 row
三部曲:
参数:n, row,chessboard
终止条件:当遍历完所有行(row) 时,就收集结果集。
单层搜索:在for循环中,判断当前位置放 Q 是否合法,合法就放入,然后进行递归。
这里就显示出来一维和二维的区别。
二维: for循环控制列,递归控制行
一维:for循环取元素,递归也是用来取元素的(分为可以重复取和不能重复取
检查合法逻辑:
class Solution {
public:
vector<vector<string>> res;
bool isValid(int row, int col,int n, vector<string> &chessboard)
{
for(int i = 0; i < row; i++)
{
if(chessboard[i][col] == 'Q')
return false;
}
for(int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
{
if(chessboard[i][j] == 'Q')
return false;
}
for(int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
{
if(chessboard[i][j] == 'Q')
return false;
}
return true;
}
void backtracking(int n, int row, vector<string> & chessboard)
{
if(n == row)
{
res.push_back(chessboard);
return;
}
for(int i = 0; i < n; i++) // 列 在这 + 1
{
if(isValid(row,i , n, chessboard))
{
chessboard[row][i] = 'Q';
backtracking(n, row + 1,chessboard); // 行在这 + 1
chessboard[row][i] = '.';
}
}
return;
}
vector<vector<string>> solveNQueens(int n) {
vector<string> chessboard(n, string(n, '.'));
backtracking(n , 0, chessboard);
return res;
}
};