放国王问题1

#define int long long
#define fir first
#define snd second
typedef std::pair<int,int> pii;

const int inf=100010;

int n,k;
int g[inf][inf][inf];	//f[i][j][s]代表前i行已经放完了国王,共放了n个国王
//s代表第i行哪些位置放了国王,此时方案数是多少 

signed main()
{
	//O(nk2^(2n)) 
	std::cin>>n>k;
	f[0][0][0]=1;
	for(int i=0;i<n;i++)
		for(int j=0;j<=k;j++)
			for(int s=0;s<(1<<n);s++)	//要从f[i][j][s]这个状态向外转移,在第i+1行放国王
				if(f[i][j][s])
					for(int r=0;r<(1<<n);r++)	//i+1行怎么放国王 
					{	//检查国王会不会相互攻击 
						if(r&s)continue;	//有两个国王在同一列 
						if((r>>1)&s)continue;
						if((r<<1)&s)continue;
						if((r<<1)&r)continue;
						f[i+1][j+std::__builtin_popcount(r)][r]+=f[i][j][s];	//std::__builtin_popcount()统计二进制有多少个1 
					}
	return 0;
}
posted @ 2025-06-21 20:43  Fire_poetry  阅读(6)  评论(0)    收藏  举报