ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021-02-07

2021-02-07 14:58:58  阅读:176  来源: 互联网

标签:02 07 int queen -- num 2021 table col


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

标签:02,07,int,queen,--,num,2021,table,col
来源: https://blog.csdn.net/qq_43642136/article/details/113741073

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有