【BZOJ】1087【SCOI2005】互不侵犯King
2016-07-20 17:23
274 查看
Description
在N×N 的棋盘里面放K 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8 个格子。
Input
只有一行,包含两个数N,K(1<=N<=9,0<=K<=N∗N)
Output
方案数。
SampleInput
3 2
SampleOutput
16
Solution
大暴搜……压位好写……
预处理可行状态,连边,然后DP
在N×N 的棋盘里面放K 个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8 个格子。
Input
只有一行,包含两个数N,K(1<=N<=9,0<=K<=N∗N)
Output
方案数。
SampleInput
3 2
SampleOutput
16
Solution
大暴搜……压位好写……
预处理可行状态,连边,然后DP
#include<stdio.h> long long f[10][82][512],ans; int n,k,tot,sum[512],poi[512],st; bool map[512][512]; void dfs(const int &p,const int &mask,const int &t) { if (p==n) { poi[tot]=mask;sum[tot++]=t; if (mask==0) st=tot-1; return; } if ((mask & (1<<(p-1)))==0) dfs(p+1,mask | (1<<p),t+1); dfs(p+1,mask,t); } inline void build() { for (int i=0;i<tot;i++) for (int j=0;j<tot;j++) if ((poi[i] & poi[j])==0 && ((poi[i]<<1) & poi[j])==0 && ((poi[i]>>1) & poi[j])==0) map[i][j]=map[j][i]=1; } int main() { scanf("%d%d",&n,&k); dfs(1,0,0);dfs(1,1,1); build(); f[0][0][st]=1; for (int i=1;i<=n;i++) for (int j=0;j<=k;j++) for (int o=0;o<tot;o++) if (sum[o]<=j) for (int p=0;p<tot;p++) if (map[o][p]) f[i][j][o]+=f[i-1][j-sum[o]][p]; for (int i=0;i<tot;i++) ans+=f [k][i]; printf("%lld",ans); }
相关文章推荐
- 《leetcode》: LRU Cache
- Fragment在inflate时的注意事项
- Mysql cluster集群的搭建
- 4-1 单链表逆转 (20分)
- 2016multi-university1005 KM算法
- win7下64bit,运行libsvm2.90中setup.py时出现unable to find vcvarsall.bat 的解决方法
- python 笔记
- UML 类图
- 图片转换为字节流,字节流转换为图片
- 折线分割平面 hd 2050
- BlockingQueue
- 基本UDP套接字编程
- 数据类型所佔用内存大小
- Java实现 二叉搜索树算法(BST)
- hdoj4548美素数(素数打表,易超时)
- 【日常练习】Prime Ring Problem(素数环)
- Photon Server笔记1:启动MMO Demo 2016/07/20
- 一个界面使用两个tableView
- 使用GCC和CMake编译OpenCV
- [转]进程创建-终结流程图