首页 > 其他 > 详细

leetcode 51 N皇后问题

时间:2019-04-12 22:32:43      阅读:123      评论:0      收藏:0      [点我收藏+]

 

 技术分享图片

 

其实就是全排列问题+剪枝,也是很经典很经典

代码:

class Solution {
public:
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string>> res;
        vector<int> pos(n,-1);//记录第i+1行的皇后,应该放在第j+1列
        int row=0;
        DFS(n,row,pos,res);
        return res;
    }
    void DFS(int n,int row,vector<int>& pos,vector<vector<string>>& res){
        //回溯法,能到下一条语句一定合法
        //递归边界1,得到最终的解;
        if(row==n){
            vector<string> temp(n,string(n,.));
            for(int i=0;i<n;i++){
                temp[i][pos[i]]=Q;
            }
            res.push_back(temp);
        }else{
            for(int col=0;col<n;col++){
                //新加皇后到row+1行,col+1列合法,进入子问题;如果新皇后怎么加都无效,则本次循环结束,col+1进行下一次循环
                //判断是否需要向子问题递归,不需要则返回上一层;
                if(isvalid(pos,row,col)){
                    pos[row]=col;
                    DFS(n,row+1,pos,res);
                    pos[row]=-1;
                }
            }
        }
        
    }
    bool isvalid(vector<int>& pos,int row,int col){
        //判断是否放在了已经有皇后的列上,以及是否在同一对角线上;
        for(int i=0;i<row;i++){
            if((col==pos[i])||(abs(row-i)==abs(col-pos[i])))
                return false;
        }
        return true;
    }
};

 

leetcode 51 N皇后问题

原文:https://www.cnblogs.com/joelwang/p/10699025.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!