sb状压,输int错了一次,没救了。。。
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define N (1<<9)+10
int n,m;
bool g[N][N];
ll f[11][110][N],ans;
int num[N];
int check(int x,int y)
{
for(int i=0;i<n;i++)
if(y>>i&1)
{
if(y>>i+1&1)return 0;
if(x>>i+1&1)return 0;
if(i&&x>>i-1&1)return 0;
if(i&&y>>i-1&1)return 0;
if(x>>i&1)return 0;
}
return 1;
}
int main()
{
//freopen("tt.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=0;i<1<<n;i++)
for(int j=0;j<1<<n;j++)
g[i][j]=check(i,j);
for(int i=1;i<1<<n;i++)
num[i]=num[i-(i&-i)]+1;
f[0][0][0]=1;
for(int i=0;i<n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<1<<n;k++)
for(int t=0;t<1<<n;t++)
if(g[k][t]&&j+num[t]<=m)
f[i+1][j+num[t]][t]+=f[i][j][k];
for(int i=0;i<1<<n;i++)
ans+=f[n][m][i];
printf("%lld\n",ans);
return 0;
}