class Solution {
private:
//快速判断是否符合条件
//col[i]表示第i列是否有棋子
//diaLeft表示从右上到左下的对角线是否有棋子,每条对角线上的点i+j都相等(横坐标+纵坐标相等)
//diaRight表示从左上到右下的对角线是否有棋子,每条对角线上的点i-j+n-1都相等(横坐标-纵坐标相等)
vector<bool> col,diaLeft,diaRight;
vector<vector<string>> res;
//index表示开始放第index个棋子,row表示第i行的棋子放在第row[i]列
void putQueen(int n, int index, vector<int> &row){
if(index==n){
res.push_back(generate(n,row));
return;
}
for(int i=0;i<n;++i){
if(!col[i] && !diaLeft[index+i] && !diaRight[index-i+n-1]){
row.push_back(i);
col[i]=true;
diaLeft[index+i]=true;
diaRight[index-i+n-1]=true;
putQueen(n,index+1,row);
//回溯
col[i]=false;
diaLeft[index+i]=false;
diaRight[index-i+n-1]=false;
row.pop_back();
}
}
return;
}
//画棋盘
vector<string> generate(int n,vector<int> &row){
assert(n==row.size());
//先生成n*n的'.'矩阵
vector<string> board(n,string(n,'.'));
//在第i行第row[i]列换成Q
for(int i=0;i<n;++i)
board[i][row[i]]='Q';
return board;
}
public:
vector<vector<string>> solveNQueens(int n) {
res.clear();
col.clear();
diaLeft.clear();
diaRight.clear();
col=vector<bool>(n,false);
diaLeft=vector<bool>(2*n-1,false);
diaRight=vector<bool>(2*n-1,false);
vector<int> row;
putQueen(n,0,row);
return res;
}
};
51. N皇后/C++
猜你喜欢
转载自blog.csdn.net/Zolewit/article/details/89669162
今日推荐
周排行