只有 10 pts
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll dp[15][85][1500];
ll kings[1500],cnt[1500];
int num=0,n,k;
void Init()
{
//一个一个找下去,判断是否符合一行内的限制,符合就记下来。
int maxs=1<<n;
//这个表示符合条件的数的数量。
for(int i=0;i<=maxs;i++)
{
if(((i&(i<<1))==0)&&((i&(i>>1))==0))//符合条件
{
cnt[++num]=i;
int S=i;
while(S>0)
{
if(S%2==1) kings[num]++;
S>>=2;
}
}
}
dp[0][0][0]=1;
//有一个方案:考虑到第0行时,一个王都不放的情况。
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n>>k;
Init();
for(int i=1;i<=n;i++)//枚举行
{
for(int j=1;j<=num;j++)//第i行的状态
{
for(int q=1;q<=num;q++)//第i-1行的状态
{
int s1=cnt[j],s2=cnt[q];
if((s1&s2)==0&&((s1<<1)&s2)==0&&(s1&(s2<<1))==0)
{
for(int l=kings[j];l<=k;l++)
{
dp[i][l][s1]+=dp[i-1][l-kings[j]][s2];
}
}
}
}
}
ll ans=0;
for(int i=1;i<=num;i++)
{
ans+=dp[n][k][cnt[i]];
}
cout<<ans;
return 0;
}