题目链接:hdu 4499 Cannon

题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击。

解题思路:枚举行放的情况,用二进制数表示,每次放之前推断能否放下(会不会和已经存在的棋子冲突),放下后推断会不会互相攻击的炮,仅仅须要对每一个新加入的炮考虑左边以及上边就能够了。

#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std;
const int N = 10;
int c, si[N*5]; inline int bitCount(int x) {
return x == 0 ? 0 : bitCount(x/2) + (x&1);
} void mkdir() {
c = 0;
for (int i = 0; i < (1<<5); i++) {
if (bitCount(i) <= 3)
si[c++] = i;
}
} int n, m, k, ans, g[N][N], tp; void init () {
memset(g, 0, sizeof(g));
ans = 0;
tp = (1<<m)-1;
int x, y;
for (int i = 0; i < k; i++) {
scanf("%d%d", &x, &y);
g[x][y] = 1;
}
} inline bool judgeSet(int d, int s) {
for (int i = 0; i < m; i++)
if ((s&(1<<i)) && g[d][i])
return false;
return true;
} inline void Set(int d, int s, int val) {
for (int i = 0; i < m; i++)
if (s&(1<<i))
g[d][i] = val;
} inline bool checkup(int x, int y) {
int flag = 0;
for (int i = x - 1; i >= 0; i--) {
if (flag && g[i][y] == 2)
return true;
else if (flag && g[i][y] == 1)
return false;
else if (g[i][y])
flag = 1;
}
return false;
} inline bool checklf(int x, int y) {
int flag = 0;
for (int i = y - 1; i >= 0; i--) {
if (flag && g[x][i] == 2)
return true;
else if (flag && g[x][i] == 1)
return false;
else if (g[x][i])
flag = 1;
}
return false;
} bool judgeOk(int d) {
for (int i = 0; i < m; i++) {
if (g[d][i] == 2) {
if (checkup(d, i))
return false;
if (checklf(d, i))
return false;
}
}
return true;
} void dfs(int d, int cnt) { if (ans >= (n-d)*3+cnt)
return; if (d >= n) {
ans = max(ans, cnt);
return;
} for (int i = 0; i < c; i++) { if (si[i] > tp)
continue; if (judgeSet(d, si[i])) {
Set(d, si[i], 2); if(judgeOk(d)) {
dfs(d+1, cnt + bitCount(si[i]));
} Set(d, si[i], 0);
}
}
} int main () {
mkdir();
while (scanf("%d%d%d", &n, &m, &k) == 3) {
init();
dfs(0, 0);
printf("%d\n", ans);
}
return 0;
}

最新文章

  1. [转]Tomcat启动java.lang.OutOfMemoryError: PermGen space错误解决
  2. 0008《SQL必知必会》笔记04-子查询、联接与组合查询
  3. Windows Server 2008 R2 每隔一段时间自动关机解决办法
  4. pc/app 项目/功能设计
  5. curl命令 抓取网络数据相应头
  6. Java 正则表达式 向前、向后匹配
  7. 06_WebService与Socket的区别
  8. ubuntu JDK
  9. 《Algorithms 4th Edition》读书笔记——2.4 优先队列(priority queue)-Ⅴ
  10. aauto攫http数据
  11. Openstack中keystone与外部LDAP Server的集成
  12. 2018-2019-2 网络对抗技术 20165228 Exp1 PC平台逆向破解
  13. PHP的优化建议(仅借鉴)
  14. 参数FAST_START_MTTR_TARGET的理解
  15. Nginx 的两种认证方式
  16. es-aggregations聚合分析
  17. SOA并不能解决高并发事务
  18. 摘抄JPA官方文档原文 防呆
  19. 领域Command
  20. Java进阶——— 线程池的原理分析

热门文章

  1. (转)如何将ecshop首页主广告位的flash轮播替换为js轮播
  2. sql - sum() 和 count() 函数的区别
  3. 【转】 iOS 两种方法实现左右滑动出现侧边菜单栏 slide view
  4. Java中long和double的原子性
  5. 数据类型和Json格式[转]
  6. postgres常用操作
  7. apache静态文件配置
  8. Foreign Exchange(交换生换位置)
  9. iphone升级ios7之后出现蓝框框一直跳的问题
  10. Fedora 19+ 启动顺序调整