在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;
}