class Solution
{
public:
vector<vector<string>> res;
public:
vector<vector<string>> solveNQueens(int n)
{
vector<string> board;
string str;
// 初始化空棋盘
for (int i = 0; i < n; i++)
{
str += '.';
}
for (int j = 0; j < n; j++)
{
board.push_back(str);
}
backtrack(board, 0);
return res;
}
private:
void backtrack(vector<string>& board, int row)
{
// 1、结束条件
if (row == board.size())
{
res.push_back(board);
return;
}
int n = board[row].size();
for (int col = 0; col < n; col++)
{
// 2、排除不合法的选择,判断是否符合 N 皇后的条件
if (!isvaild(board, row, col)) continue;
// 3、做选择,添加 N 皇后
board[row][col] = 'Q';
// 4、进入下一个决策,递归寻找下一个 N 皇后
backtrack(board, row + 1);
// 5、撤销选择
board[row][col] = '.';
}
}
bool isvaild(vector<string>& board, int row, int col)
{
int n = board[row].size();
// 1、判断当前列是否有 N 皇后
for (int i = 0; i < row; i++)
{
if (board[i][col] == 'Q')
return false;
}
// 2、判断左上角是否有 N 皇后冲突
for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--)
{
if (board[i][j] == 'Q')
return false;
}
// 3、判断右上角是否有 N 皇后冲突
for (int i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++)
{
if (board[i][j] == 'Q')
return false;
}
return true;
}
};
005 回溯算法实现 N 皇后问题[C++]
猜你喜欢
转载自blog.csdn.net/weixin_47156401/article/details/120604704
今日推荐
周排行