八皇后

八皇后

普通解法

#include<cstdio>
#include<iostream>

const int MAXN=20;
int l1[MAXN+MAXN],l2[MAXN+MAXN],y[MAXN],mark[MAXN];
int n=0,ans=0;

void print()
{
    std::cout<<mark[1];
    for(int i=2;i<=n;i++)
        std::cout<<" "<<mark[i];
    std::cout<<std::endl;
}

void search(int x)
{
    if(x==n+1)
    {
        ans++;
        if(ans<=3)print();
        return;
    }
    for(int i=1;i<=n;i++)
        if(!y[i]&&!l1[x+i]&&!l2[x-i+n])
        {
            y[i]=l1[x+i]=l2[x-i+n]=true;
            mark[x]=i;
            search(x+1);
            y[i]=l1[x+i]=l2[x-i+n]=false;
        }
}

int main()
{
    std::cin>>n;
    search(1);
    std::cout<<ans<<std::endl;
    return 0;
}

位运算

#include <iostream>
using namespace std;
const int MAXN=15;
int a[MAXN];
void printAns(int n)
{
    for(int i=1;i<=n;i++)
        for(int j=0;j<n;j++)
            if((1<<j) & a[i])
            {
                cout<<j+1;
                if(i!=n)cout<<" ";
                break;
            }
    cout<<endl;
}
void dfs(int n,int x,int L,int M,int R,int& ans)
{
    if(x==n+1)
    {
        if(++ans<=3)printAns(n);
        return;
    }
    int D=~(L|M|R),U=1<<n;
    for(int k=D&-D;D && k<U;D-=k,k=D&-D)
    {
        a[x]=k;
        dfs(n,x+1,(L|k)<<1,M|k,(R|k)>>1,ans);
    }
}
int main()
{
    int n,ans=0;
    cin>>n;
    dfs(n,1,0,0,0,ans);
    cout<<ans<<endl;
    return 0;
}

现在才知道原来位运算法再往下挖就是状压

posted @ 2018-07-30 16:29  昤昽  阅读(120)  评论(0编辑  收藏  举报