记录编号 174166 评测结果 AAAAAAAAAA
题目名称 放国王 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.018 s
提交时间 2015-07-31 16:13:13 内存使用 5.62 MiB
显示代码纯文本
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int n,k,z[3600],tot,num[2500];
long long f[12][520][111];
int sd(int y){
	int sum=0;
	while(y){
		if(y>0){
			if(y&1)
				sum++;
			y>>=1;
		}
	}
	return sum;
}
int main(){
	freopen("placeking.in","r",stdin);
	freopen("placeking.out","w",stdout);
	scanf("%d%d",&n,&k);
	for(int x=0;x<(1<<n);++x){
		if(x&(x<<1))
		  continue;
		else
		   {
		   	  z[++tot]=x;
		   	  num[tot]=sd(x);
		   }
	}
	for(int i=1;i<=tot;++i)
	   f[1][i][num[i]]=1;
	 for(int i=2;i<=n;++i){
	 	for(int j=1;j<=tot;++j)
	 		{ for(int r=0;r<=k;++r)
	 		   {
		 		   	//if(f[i-1][j][r]==0) continue;
		 			for(int h=1;h<=tot;++h){
					       if((z[h]&z[j])||(z[h]&(z[j]<<1))||(z[h]&(z[j]>>1)))
					         continue;
			 			   if(r+num[h]>k)  continue;
			 			   else
			 			   	  f[i][h][r+num[h]]+=f[i-1][j][r];
		 			}
	 		   }
	 		}
	 	}
	 long long ans=0;
	 for(int i=1;i<=tot;++i) 
	   ans+=f[n][i][k];
	printf("%lld",ans);
}