栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

N皇后问题——暴力递归+位运算优化版本——java

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

N皇后问题——暴力递归+位运算优化版本——java

N皇后问题

返回摆放的方式有几种

public int num(int n){
    if(n<1){
        return 0;
    }
    int[] record=new int[n];//record[i]->i行的皇后放在了第几列
    return process(0,record,n);
}

public int process(int i,int[] record,int n){
    if(i==n){
        return 1;//base case 之前的做法是对的 返回一
    }
    int res=0;
    for(int j=0;j
        //当前i行的皇后,放在j列,会不会和之前(0...i-1)的皇后共行或共斜线
        if(isValid(record,i,j)){
            record[i]=j;
            res+=process(i+1,record,n);
        }
    }
    return res;
}

public boolean isValid(int[] record,int i,int j){
    for(int k=0;k
        if(j==record[k]||Math.abs(record[k]-j)==Math.abs(k-i)){
            return false;
        }
    }
    return true;
}

N皇后问题有更好的思路和算法,但都是很难的

面试掌握程度只需要到这种程度即可

但是可以在这种思路上做一些优化

优化版本:位运算(在时间上优化程度很高)

每一行做的选择都变成了限制信息

斜线:在列的限制加上之后整体移动

//不要超过32皇后问题
public int num(int n){
    if(n<1||n>32){
        return 0;
    }
    int limit=n==32?-1:(1<
    if(colLim==limit){//base case 列限制信息跟limit一样的时候就是n个皇后都放置完成之后
        return 1;
    }
    int pos=0;
    int mostRightOne=0;
    pos=limit&(~(colLim|leftDiaLim|rightDiaLim));//pos值为1的数就是现在可以放的位置,(colLim|leftDiaLim|rightDiaLim)是现在所有不能放的位置
    int res=0;
    while(pos!=0){
        mostRightOne=pos&(~pos+1);//取到最右边为1的数
        pos=pos-mostRightOne;
        res+=process(limit,colLim|mostRightOne,(leftDiaLim|mostRightOne)<<1,(rightDiaLim|mostRightOne)>>>1);//选取最右边为1的数放置皇后之后,加上下一列的限制条件进行递归
    }
    return res;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/980119.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号