E25 状态压缩DP 小国王
视频链接:https://www.bilibili.com/video/BV1pf4y1q7hU/
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子。
输入格式
只有一行,包含两个数 N,K( 1 ≤ N ≤ 9, 0 ≤ K ≤ N * N)
输出格式
所得的方案数
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int n,k; //棋盘行数,国王总数 int cnt; //一行的合法状态个数 int s[1<<12]; //一行的合法状态集 int num[1<<12]; //每个合法状态包含的国王数 long long f[12][144][1<<12]; //f[i,j,a]表示前i行已放了j个国王,第i行的第a个状态时的方案数 int main(){ cin>>n>>k; for(int i=0; i<(1<<n); i++) //枚举一行的所有状态 if(!(i & i>>1)){ //如果不存在相邻的1 s[cnt++]=i; //一行的合法状态集,例101 for(int j=0; j<n; j++) num[i]+=(i>>j & 1); //每个合法状态包含的国王数 } f[0][0][0]=1; //边界 for(int i=1; i<=n+1; i++) //枚举行 for(int j=0; j<=k; j++) //枚举国王数 for(int a=0; a<cnt; a++) //枚举第i行的合法状态 for(int b=0; b<cnt; b++) //枚举第i-1行的合法状态 { int c=num[s[a]]; //第i行第a个状态的国王数 if((j>=c) //可以继续放国王 &&!(s[b]&s[a]) //不存在同列的1 &&!(s[b]&(s[a]<<1)) //不存在斜对角的1 &&!(s[b]&(s[a]>>1))) f[i][j][a]+=f[i-1][j-c][b]; //行间转移 } cout<<f[n+1][k][0]<<endl; //第n+1行不放国王的方案数 return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!