在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
标签:color ini problem ems continue algorithm 信息 code last
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
方案数。
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; int n, k,num[1000]; long long dp[10][1000][1000]; bool flag[1000]; long long ans; void init() { for (int i = 0; i < (1 << n); i++) if (!(i & (i << 1))) { flag[i] = true; int t = i; while (t) { num[i] += (t & 1); t >>= 1; } dp[1][num[i]][i] = 1; } } int main() { scanf("%d%d", &n, &k); init(); for (int i = 2; i <= n; i++) for (int j = 0; j <= k; j++) for (int now = 0; now < (1 << n); now++) { if (!flag[now]) continue; if (num[now] > j) continue; for (int last = 0; last < (1 << n); last++) { if (!flag[last]) continue; if ((last & now) || ((now << 1) & last) || ((now >> 1) & last)) continue; dp[i][j][now] += dp[i - 1][j - num[now]][last]; } } for (int i = 0; i < (1 << n); i++) ans += dp[n][k][i]; printf("%lld", ans); return 0; }
标签:color ini problem ems continue algorithm 信息 code last
原文地址:http://www.cnblogs.com/zbtrs/p/6189240.html