试题描述
在 n×n(1≤n≤10)的棋盘上放 k(0≤k≤n)个国王(可攻击相邻的8个格子),求使它们无法互相攻击的方案总数。

输入
输入有多组方案,每组数据只有一行为两个整数n和k。
输出
每组数据一行为方案总数,若不能够放置则输出 0。
输入示例
样例输入 1
3 2
样例输入 2
4 4
输出示例
样例输出 1
16
样例输出 2
152

这道题看上去很像八皇后,但是变成的国王以后无疑会增加很多情况,暴力会炸。而因为国王只影响到上下左右八个各自,所以我们能用状压DP解决。

设f[i][j][k]表示第i行,第j种状态下,一共有k个国王的情况。其中j是一个二进制数,比如74代表的是它的二进制1001010代表的是这一行的国王摆放情况。

然后预处理num[i]代表i这种状态需要的国王数,比如num[74]=3

转移方程就是:f[i][j][k]+=f[i-1][t][k-num[j]];其中k、t分别表示当前行的状态和上一行的状态。其中保重k、t互相满足。

代码如下:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <cmath>
  6. #include <cstdlib>
  7. #include <queue>
  8. #include <stack>
  9. #include <vector>
  10. using namespace std;
  11. #define MAXN 155
  12. #define INF 10000009
  13. #define MOD 10000007
  14. #define LL long long
  15. #define in(a) a=read()
  16. #define REP(i,k,n) for(int i=k;i<=n;i++)
  17. #define DREP(i,k,n) for(int i=k;i>=n;i--)
  18. #define cl(a) memset(a,0,sizeof(a))
  19. inline int read(){
  20. int x=,f=;char ch=getchar();
  21. for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
  22. for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
  23. return x*f;
  24. }
  25. inline void out(int x){
  26. if(x<) putchar('-'),x=-x;
  27. if(x>) out(x/);
  28. putchar(x%+'');
  29. }
  30. LL n,m,total,f[][MAXN][MAXN],num[MAXN],s[MAXN],ans;
  31. int main(){
  32. in(n);in(m);
  33. REP(i,,(<<n)-){
  34. if(i&(i<<)) continue;
  35. int k=;
  36. REP(j,,n-) if(i&(<<j)) k++;
  37. s[++total]=i;
  38. num[total]=k;
  39. }
  40. f[][][]=;
  41. REP(i,,n)
  42. REP(j,,total)
  43. REP(k,,m)
  44. if(k>=num[j])
  45. REP(t,,total)
  46. if(!(s[t]&s[j]) && !(s[t]&(s[j]<<)) && !(s[t]&(s[j]>>)))
  47. f[i][j][k]+=f[i-][t][k-num[j]];
  48. REP(i,,total) ans+=f[n][i][m];
  49. cout<<ans;
  50. return ;
  51. }

Loj10170骑士的更多相关文章

  1. COGS746. [网络流24题] 骑士共存

    骑士共存问题«问题描述:在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘 上某些方格设置了障碍,骑士不得进入. «编程任务:对于给定的n*n个方格的国际象棋棋盘和障碍标志 ...

  2. 【BZOJ1671】[Usaco2005 Dec]Knights of Ni 骑士 BFS

    [Usaco2005 Dec]Knights of Ni 骑士 Description  贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为 ...

  3. 骑士游历/knight tour - visual basic 解决

    在visual baisc 6 how to program 中文版第七章的练习题上看到了这个问题,骑士游历的问题. 在8x8的国际象棋的棋盘上,骑士(走法:一个方向走两格,另一个方向一格)不重复走完 ...

  4. BZOJ1085: [SCOI2005]骑士精神 [迭代加深搜索 IDA*]

    1085: [SCOI2005]骑士精神 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1800  Solved: 984[Submit][Statu ...

  5. BZOJ 1040 【ZJOI2008】 骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战火 ...

  6. 【BZOJ-1040】骑士 树形DP + 环套树 + DFS

    1040: [ZJOI2008]骑士 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3312  Solved: 1269[Submit][Status ...

  7. BZOJ1040 [ZJOI2008]骑士

    Description Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪恶的Y国发动了一场针对Z国的侵略战争.战 ...

  8. BFS 骑士的移动

    骑士的移动 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/E 题目: Description A f ...

  9. LA 3523 圆桌骑士

    题目链接:http://vjudge.net/contest/141787#problem/A http://poj.org/problem?id=2942 此题很经典 知识点:DFS染色,点-双连通 ...

随机推荐

  1. Traffic-Server配置(待补充和更新)

    Server 5.3.2 测试1.裸盘:remap.configmap http://192.168.227.131 http://192.168.227.131:8080 #traffic_serv ...

  2. 使用wifite破解路由器密码

    使用wifite破解路由器密码 发表于 2016-02-06   |   分类于 wifite  |   暂无评论  |   10次阅读 简介 wifite是一款自动化wep.wpa破解工具,不支持w ...

  3. git push multiple repo

    git remote add xxx https://git.github.com

  4. 33 - 并发编程-线程同步-Event-lock

    目录 1 线程同步 1.1 Event 1.1.1 什么是Flag? 1.1.2 Event原理 1.1.3 吃包子 1.2 Lock 1.2.1 lock方法 1.2.2 计数器 1.2.3 非阻塞 ...

  5. [转载]Firefox插件(plugins)开发实用指南

    转自: http://huandu.me/2010/02/11/595/ Firefox插件可实现强大功能,但其中麻烦事情不少.写这个实用指南首先是为了方便自己记忆,免得以后再次栽倒一些坑里面,如果能 ...

  6. 6.Python3标准库--数学运算

    ''' 作为一种通用的变成语言,Python经常用来解决数学问题.它包含一些用于管理整数和浮点数的内置类型,这很适合完成一般应用中可能出现的基本数学运算. 而标准库中包含一些用于满足更高级需求的模块. ...

  7. java基础2 判断语句:if ... else 语句和 switch 语句

    一.if ... else 判断语句 1.if ... else 判断语句的格式 1.1.格式一 if(判断条件){ 执行不满足条件的语句 } 1.2.格式二 if(判断语句){ 满足条件的语句 }e ...

  8. HDU 2894 DeBruijin (数位欧拉)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2894 题目大意:旋转鼓的表面分成m块扇形,如图所示(m=8).图中阴影区表示用导电材料制成,空白区用绝 ...

  9. CSU 1102 多连块拼图

    多连块拼图 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述     多连块是指由多个等大正方形边与边连接而成的平面连通图形.         ———— 维基百科      ...

  10. EF – 8.多对多关联

    5.6.10 <多对多关联(上)> 时长:9分57秒 难度:难 5.6.11<多对多关联(下)> 时长:8分50秒 难度:难 如果单独地把多对多关联的CRUD拿出来讲,确实比较 ...