2021-02-07

class Solution {
public:
    vector<vector<string>>res;
    vector<string>cur;
    vector<int>col_vec;//已经放置的列
    vector<vector<string>> solveNQueens(int n) {
        bool**table=new bool*[n];
        for(int i=0;i<n;i++)table[i]=new bool[n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                table[i][j]=true;
            }
        }
        dfs(0,n,table);
        return res;
    }
    //逐行放置于第 0,1,2,.....,n-1行
    void dfs(int queen_num,int n,bool**table){
        //在第queen_num行放置棋子
        if(queen_num==n){
            res.push_back(cur);
            return;
        }
        for(int i=0;i<n;i++){
            //尝试放置于第i列
            if(table[queen_num][i]){
                string cur_string;
                for(int j=0;j<i;j++)cur_string+='.';
                cur_string+='Q';
                for(int j=0;j<n-i-1;j++)cur_string+='.';
                set_table(queen_num,i,table,n);
                cur.push_back(cur_string);
                col_vec.push_back(i);
                dfs(queen_num+1,n,table);
                col_vec.pop_back();
                reset_table(queen_num,i,table,n);
                for(int k=0;k<col_vec.size();k++){
                    set_table(k,col_vec[k],table,n);
                }
                cur.pop_back();
            }
        }
    }
    void reset_table(int queen_num,int col,bool**table,int n){
        for(int j=0;j<n;j++)table[queen_num][j]=true;//第queen_num行可以放置
        for(int j=0;j<n;j++)table[j][col]=true;//第col列可以放置
        //将对角线设置为可以放置
        int i=queen_num,j=col;
        while(i>=0&&j>=0){
            //左上
            table[i--][j--]=true;
        }
        i=queen_num,j=col;
        while(i<n&&j>=0){
            //左下
            table[i++][j--]=true;
        }
        i=queen_num,j=col;
        while(i>=0&&j<n){
            //右上
            table[i--][j++]=true;
        }
        i=queen_num,j=col;
        while(i<n&&j<n){
            //右下
            table[i++][j++]=true;
        }
    }
    void set_table(int queen_num,int col,bool**table,int n){
        for(int j=0;j<n;j++)table[queen_num][j]=false;//第queen_num行禁止放置
        for(int j=0;j<n;j++)table[j][col]=false;//第col列禁止放置
        //将对角线设置为禁止放置
        int i=queen_num,j=col;
        while(i>=0&&j>=0){
            //左上
            table[i--][j--]=false;
        }
        i=queen_num,j=col;
        while(i<n&&j>=0){
            //左下
            table[i++][j--]=false;
        }
        i=queen_num,j=col;
        while(i>=0&&j<n){
            //右上
            table[i--][j++]=false;
        }
        i=queen_num,j=col;
        while(i<n&&j<n){
            //右下
            table[i++][j++]=false;
        }
    }
};
上一篇:php-处理Google OpenID


下一篇:[LightOJ 1061] N Queen Again