在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
方案数。
#include<queue> #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; long long f[12][2000][200]; int cnt; int n,m; int s[2000]; int t[2000]; long long ans; void dfs(int x,int y,int sum) { if(y>=n) { s[++cnt]=x; t[cnt]=sum; return ; } dfs(x,y+1,sum); dfs(x|(1<<y),y+2,sum+1); } int main() { scanf("%d%d",&n,&m); dfs(0,0,0); for(int i=1;i<=cnt;i++) { f[1][i][t[i]]=1; } for(int i=2;i<=n;i++) { for(int j=1;j<=cnt;j++) { for(int k=1;k<=cnt;k++) { if(s[j]&s[k]) { continue; } if((s[j]<<1)&s[k]) { continue; } if(s[j]&(s[k]<<1)) { continue; } for(int l=t[j];l<=m;l++) { f[i][j][l]+=f[i-1][k][l-t[j]]; } } } } for(int j=1;j<=cnt;j++) { ans+=f[n][j][m]; } printf("%lld",ans); }
原文:https://www.cnblogs.com/Khada-Jhin/p/9301774.html