按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。
每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
思路:1、初始化棋盘,将所有的位置都变为' . ' vector<string> chessboard(n,string(n,'.'));
2、判断位置是否合法,只需要考虑到当前行之前的部分,因为Q依据行从上而下填,下面肯定没有皇后;
3、这里的终止条件,row是从0开始的,row==n了就代表最后一行n-1已经处理过了。
class Solution {
private:
//3维 不同的棋盘
vector<vector<string>> result;
public:
//判断这个点放皇后是否合法
bool isValid(vector<string>& chessboard,int row,int col,int n){
//判断列是否合法
//因为是从上而下放的皇后,所以下面肯定没有
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(vector<string>& chessboard,int n,int row){
//终止条件
if(row==n)
{
result.push_back(chessboard);
return;
}
//单层处理
for(int i=0;i<n;i++)
{
if(isValid(chessboard,row,i,n))
{
chessboard[row][i]='Q';
backtracking(chessboard,n,row+1);
chessboard[row][i]='.';//回溯
}
else continue;
}
}
vector<vector<string>> solveNQueens(int n) {
result.clear();
//初始化一个棋盘
vector<string> chessboard(n,string(n,'.'));
backtracking(chessboard,n,0);
return result;
}
};