棋盘放车(DP状态压缩)

来源:互联网 发布:oracle sql case when 编辑:程序博客网 时间:2024/05/29 13:22

在n*n(n≤20)的方格棋盘上放置 n 个车(可以攻击所在行、列),求使它们不能互相攻击的方案总数。



#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int INF=(1<<20)-1;long long f[INF];int main(){    int n;    scanf("%d",&n);    long long i,S,j;            f[0]=1;    for(S=1;S<=(1<<n)-1;++S)  //遍历所有的状态    {        for(i=1;i<=n;++i) //把S的每个1变成0,累加        {            if(( S & 1<<(i-1))>0)//状态S的第i列有棋子,            {                long long s=S^1<<(i-1);//去掉第i列的1                f[S]+=f[s];            }        }    }    printf("%lld\n",f[(1<<n)-1]);  //注意要用 lld才能得到正确结果     return 0;}

原创粉丝点击