51. N皇后/C++

在这里插入图片描述

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;
    }
};

猜你喜欢

转载自blog.csdn.net/Zolewit/article/details/89669162
今日推荐