回溯之n皇后二进制

左程云n皇后

package com.zhang.reflection.面试.算法模版.回溯模版.棋盘;
import java.util.Scanner;
public class 状态N皇后 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(Num(n));
    }

    private static int Num(int n) {
        if(n<1||n>32){
            return 0;
        }
        //整个的限制
        int limit=n==32?-1:(1<<n)-1;
        return process(limit,0,0,0);
    }
    //limit:整个的限制
    //collim:列的限制
    //leftDiaLim:左斜线的限制
    //rightDiaLim:右斜线的限制
    private static int process(int limit, int colLim, int leftDiaLim, int rightDiaLim) {
        if(colLim==limit){
            return 1;
        }
        int pos=limit & (~(colLim|leftDiaLim|rightDiaLim));
        int mostRightOne=0;
        int res=0;
        while(pos!=0){
            //取pos最右边的1 也可以写成pos&(-pos);
            mostRightOne=pos&(~pos+1);
            pos=pos-mostRightOne;
            res+=process(limit,colLim|mostRightOne,(leftDiaLim|mostRightOne)<<1,(rightDiaLim|mostRightOne)>>>1);
        }
        return res;
    }
}
全部评论

相关推荐

喜欢疯狂星期四的猫头鹰在研究求职打法:短作业优先
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务