这题也好难,但是感觉跟之前一个翻转二维数组有点像,只不过这个加上一个回溯?
用回溯的模板感觉也还行
class Solution {
private:
vector<vector<string>>result;
void backtracking(int n, int row, vector<string>& chessboard) {
if (row == n) {
result.push_back(chessboard);
return;
}
for(int col=0;col<n;col++)
{
if(isValid(row,col,chessboard,n))
{
chessboard[row][col]='Q';
backtracking(n,row+1,chessboard);
chessboard[row][col]='.';
}
}
}
bool isValid(int row, int col, vector<string>& chessboard, int n) {
// 检查列
for(int i=0;i<row;i++)
{
if(chessboard[i][col]=='Q')return false;
}
//检查45°角
for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--)
{
if(chessboard[i][j]=='Q')return false;
}
//检查135°角
for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++)
{
if(chessboard[i][j]=='Q')return false;
}
return true;
}
public:
vector<vector<string>> solveNQueens(int n) {
result.clear();
std::vector<std::string> chessboard(n, std::string(n, '.'));
backtracking(n,0,chessboard);
return result;
}
};