题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6

class Solution {
public:
    int Nqueen(int n) {
        //columnindex为表示八皇后摆法的数组
        //columnindex的数组下标代表第几列
        //columnindex[i]=j,代表第i列的第j行摆下一枚皇后
        //由于是n皇后问题,我们所需的合法样例中,n*n的棋盘必然恰好摆下n个皇后,且行列不重合
        //因此,只要得到columnindex的全排列,再校验每个结果是否合法(存在斜线冲突)
        vector<int> columnindex;
        columnindex.resize(n);
        //初始化columnindex
        for(int i=0;i<n;i++){
            columnindex[i]=i;
        }
        vector<vector<int>> res;
        permutation(columnindex,0,res,n);
	    //本题目不要求输出n皇后的具体排布,故只输出size()即可,事实上算法获得了所有具体的排布方式
        return res.size();     
    }
    //输出【无重复】元素字符串的全排列,并使用check函数审查是否是合格n皇后
    void permutation(vector<int> array,int index,vector<vector<int>>& res,int n){
        if(index==n){
            //检查是否是合规的皇后摆法(即检查对角线)
            if(check(array,n)){
                res.push_back(array);
            }
            return;
        }
        for(int i=index;i<n;i++){
            swap(array[i],array[index]);
            permutation(array,index+1,res,n);
            swap(array[i],array[index]);
        }
    }
    bool check(vector<int> array,int n){
        //对于每个(行坐标,列坐标) (array[i],i)
        for(int i=0;i<n;i++){
            //检查其与(array[j],j)是否在一条斜线上,两种情况,  
            for(int j=i+1;j<n;j++){
                if((array[i]-array[j])==(i-j)){     //1 平行对角线的斜线
                    return false;
                }else if((array[i]-array[j])==(j-i)){//2 垂直对角线的斜线
                    return false;
                }
            }
        }
        return true;
    }
};

全部评论

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
投递华为等公司10个岗位 >
点赞 评论 收藏
分享
牛客339922477号:都不用reverse,直接-1。一行。啥送分题
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务