zoukankan      html  css  js  c++  java
  • 八皇后问题

    八皇后问题一般情况下朴素的深搜就可以了,但可以对其进行二进制优化(这大概是目前最优的深搜算法):

    用二进制表示状态.1表示该点不能放(与其他位置的皇后排斥或初始状态就不能放).0表示该点可以放皇后;

    dfs保存四个参数:之前所有行的状态,从左上到右下对角线的状态,从右上到左下对角线的状态,当前为第几行;

    获取当前哪一位可以放置皇后:将四者进行或运算,得到的状态中为0的就可以放置皇后。为了方便,将其取反,1的位置表示可以放一个皇后;

    利用好lowbit()运算就可以快速得到最后一位1的位置。将状态中的1减掉,继续找下一个1;

    知道当前行的状态全为1时,即每一行都有一个皇后时,ans++;

    #include <bits/stdc++.h>
    using namespace std;
    int a[10010];
    char tmp[10010];
    int tot;
    long long ans;
    inline int lowbit(int x)
    {
        return x&(-x);
    }
    void dfs(int now,int b,int c,int dep)
    {
        if(now==tot){
            ++ans;
            return;
        }
        int sum=tot&(~(now|b|c|a[dep]));
        while(sum){
            int p=lowbit(sum);
            sum-=p;
            dfs(now+p,(b+p)*2,(c+p)/2,dep+1);
        }
    }
    int main()
    {
        int n;
        cin>>n;
        tot=(1<<n)-1;
        for(register int i=1;i<=n;i++){
            scanf("%s",tmp+1);
            for(int j=1;j<=n;j++){
                if(tmp[j]=='.') a[i]=a[i]|(1<<(n-j));
            }
        }
        dfs(0,0,0,1);
        cout<<ans;
    } 
  • 相关阅读:
    引入C/C++动态库
    Linux新手常用命令
    使用Dotfunsctor
    C#上传数据到HTTP,HTTPS 代码示例
    C#多个泛型约束问题
    创建DataTable与DataGridView进行绑定
    递归迭代vector三种方法实现二路归并排序
    区间贪心算法
    递归和非递归实现二叉树的遍历
    C语言实现全排列和回溯法总结
  • 原文地址:https://www.cnblogs.com/kamimxr/p/11502362.html
Copyright © 2011-2022 走看看