原题来自:SCOI 2005
在 的棋盘里面放 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 个格子。
输入格式
只有一行,包含两个数 。
输出格式
所得的方案数。
样例
样例输入复制
3 2
样例输出复制
16
AC代码
#include<bits/stdc++.h>
using namespace std;
int n,k;
const int maxn = 9+1,maxs = (1 << 10);
long long dp[11][11*11][maxs];
int check(int S,int T){
int last = -1e9,cnt = 0;
for(int i = 0;i < n;i++){
if((T >> i)&1){
cnt++;
if(i == last+1)return -1;
if(i && ((S >> (i-1)) & 1) == 1)return -1;
if(((S >> (i+1))& 1) ==1)return -1;
last = i;
}
}
return cnt;
}
int main(){
cin>>n>>k;
dp[0][0][0] = 1;
int ALL = (1 << n)-1;
for(int i = 0;i < n;i++){
for(int j = 0;j <= k;j++){
for(int S = 0;S <= ALL;S++){
if(dp[i][j][S]){
int SS = S ^ ALL;
for(int T = SS;T >= 0;T--){
T &= SS;
int x = check(S,T);
if(x == -1)continue;
dp[i+1][j+x][T]+= dp[i][j][S];
}
}
}
}
}
long long ret = 0;
for(int S = 0;S <= ALL;S++)ret += dp[n][k][S];
cout<<ret;
}