题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1045

题目大意:

给你一幅n*n的图,再给你一些点,这些点的上下左右不能再放其他点,除非有墙(‘X’)隔着,问最多可以放多少个这样的点。

思路:

由于n不大于4,最多16个点,想到可以二进制枚举子集,然后逐个判断每个子集的可行性。

  1. #include<iostream>
  2. #include<string>
  3. #include<vector>
  4. #include<cstdio>
  5. #include<cstring>
  6. #define FOR(i, a, b) for(int i = a; i < b; i++)
  7. using namespace std;
  8. int n, k;
  9. char a[][];
  10. int dir[][] = {,,,,-,,,-};
  11. bool judge(int x)
  12. {
  13. char b[][];
  14. int c[], tot = ;
  15. memcpy(b, a, sizeof(a));
  16. for(int i = ; i < n * n; i++)
  17. {
  18. if(x & ( << i))
  19. {
  20. int xx = i / n;
  21. int yy = i % n;
  22. if(b[xx][yy] == 'X')return false;//剪枝,如果子集覆盖了墙,直接返回假
  23. b[xx][yy] = 'a';
  24. c[tot++] = i;
  25. }
  26. }
  27. for(int i = ; i < tot; i++)//从每个点出发
  28. {
  29. int x = c[i] / n;
  30. int y = c[i] % n;
  31. for(int i = ; i < ; i++)//四个方向遍历
  32. {
  33. int xx = x + dir[i][];
  34. int yy = y + dir[i][];
  35. while(xx >= && xx < n && yy >= && yy < n)//控制边界
  36. {
  37. if(b[xx][yy] == 'X')break;//碰到墙跳出循环
  38. if(b[xx][yy] == 'a')return false;//碰到另一个'a'说明有误
  39. xx += dir[i][];//继续往这方向遍历
  40. yy += dir[i][];
  41. }
  42. }
  43. }
  44. return true;
  45. }
  46. int f(int x)//返回子集中的size
  47. {
  48. int tot = ;
  49. for(int i = ; i < (n * n); i++)
  50. {
  51. if(x & ( << i))tot++;
  52. }
  53. return tot;
  54. }
  55. int main()
  56. {
  57. while(cin >> n && n)
  58. {
  59. int ans = ;
  60. for(int i = ; i < n; i++)cin >> a[i];
  61. for(int i = ; i < ( << (n * n)); i++)
  62. {
  63. if(judge(i))ans = max(ans, f(i));//更新最优解
  64. }
  65. cout << ans << endl;
  66. }
  67. return ;
  68. }

听说可以用贪心或者二分图解决,以后学到这里再来更新

hdu1045 Fire Net---二进制枚举子集的更多相关文章

  1. UVA1354-Mobile Computing(二进制枚举子集)

    Problem UVA1354-Mobile Computing Accept:267  Submit:2232 Time Limit: 3000 mSec  Problem Description ...

  2. 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)

    标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...

  3. UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)

    题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...

  4. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  5. 杭电多校第十场 hdu6435 CSGO 二进制枚举子集

    CSGO Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Subm ...

  6. UVA 1151二进制枚举子集 + 最小生成树

    题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...

  7. 南阳OJ-91-阶乘之和---二进制枚举(入门)

    题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91 题目大意: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为 ...

  8. POJ 3279 Fliptile(反转 +二进制枚举)

    Fliptile Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13631   Accepted: 5027 Descrip ...

  9. 算法笔记-- 二进制集合枚举子集 && 求子集和 && 求父集和

    枚举子集: 复杂度:O(2^k) )&s); 用sos dp求解子集和以及父集和 子集和: ; i <= k; i--) { ; mask < (<<k); mask+ ...

随机推荐

  1. react+redux+webpack+git技术栈

    一.git bash here mdkr cnpm init -y ls -a ls -l ls -la隐藏的也可查看 cat package.json 二.npm npm i webpack-dev ...

  2. RxJS速成 (下)

    上一部分: http://www.cnblogs.com/cgzl/p/8641738.html Subject Subject比较特殊, 它即是Observable又是Observer. 作为Obs ...

  3. java-线程实现方式

    实现方式: 1,继承Thread类 public class ThreadTest extends Thread { @Override public void run() { System.out. ...

  4. Gitlab - Pull Request

    1.概述 今天查看Gmail,有网友私密我Gitlab的Pull Request工作流程,一直以为我写过这片博客,查看<Git和Gitlab协同工作>却发现遗漏了Pull Request这 ...

  5. 数据库 --> sqlite3总结

    Sqlite3总结 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. sqlite语句 #sqlite3 test.db //设置宽度为2sqlit ...

  6. 1077. Kuchiguse (20)

    The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...

  7. iptables.sh 初始化防火墙配置

    #!/bin/bash iptables -F iptables -X iptables -Z iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT ...

  8. python(练习实例)

    Python 练习实例1 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 我的代码:python 3+ #2017-7-20 list_h = [1,2,3,4 ...

  9. echarts地图的引用

    最近是跟echarts杠上了 所在公司是搞数据的 所以身为前端的我 就必须使用echarts将数据展示出来 ,进公司一周 ,前前后后大概用了八九种echarts图,我举得最难的就是引用的地图,因为刚开 ...

  10. Python开发简单爬虫(二)---爬取百度百科页面数据

    一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...