状压*
https://vjudge.net/problem/SGU-223
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int n,K,num[1500],s[1500];
long long dp[15][1500][105];
int tot=0;
void init()/////
{
for(int i=0;i<=(1<<n)-1;i++)
{
if(i & (i<<1)) continue;
int t=i;
s[++tot]=i;
int cnt=0;
while(t)
{
t-=t&(-t);
cnt++;
}
num[i]=cnt;
}
}
int main()
{
scanf("%d%d",&n,&K);
init();
//l是已经用了的个数
//dp[i][s][k]//第i行的状态,已经放置了k个棋子
for(int p=1;p<=tot;p++)
if(num[s[p]]<=K)///////
dp[1][s[p]][num[s[p]]]++;
for(int i=2;i<=n;i++)
for(int p=1;p<=tot;p++)
for(int k=0;k<=K;k++)
if(k>=num[s[p]])
{
for(int q=1;q<=tot;q++)
{
if( !(s[p] & s[q]) && !(s[p]&(s[q]<<1)) && !(s[p]&(s[q]>>1)))//////忘了八个方向还有左上,右上等等/
dp[i][s[p]][k]+=dp[i-1][s[q]][k-num[s[p]]];
}
}
LL sum=0;
for(int p=1;p<=tot;p++)
sum+=dp[n][s[p]][K];
printf("%lld\n",sum);
}