您的位置:首页 > 其它

棋盘放车(DP状态压缩)

2017-09-03 16:29 411 查看
在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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: