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

题目大意:

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

思路:

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

 #include<iostream>
#include<string>
#include<vector>
#include<cstdio>
#include<cstring>
#define FOR(i, a, b) for(int i = a; i < b; i++)
using namespace std;
int n, k;
char a[][];
int dir[][] = {,,,,-,,,-};
bool judge(int x)
{
char b[][];
int c[], tot = ;
memcpy(b, a, sizeof(a));
for(int i = ; i < n * n; i++)
{
if(x & ( << i))
{
int xx = i / n;
int yy = i % n;
if(b[xx][yy] == 'X')return false;//剪枝,如果子集覆盖了墙,直接返回假
b[xx][yy] = 'a';
c[tot++] = i;
}
}
for(int i = ; i < tot; i++)//从每个点出发
{
int x = c[i] / n;
int y = c[i] % n;
for(int i = ; i < ; i++)//四个方向遍历
{
int xx = x + dir[i][];
int yy = y + dir[i][];
while(xx >= && xx < n && yy >= && yy < n)//控制边界
{
if(b[xx][yy] == 'X')break;//碰到墙跳出循环
if(b[xx][yy] == 'a')return false;//碰到另一个'a'说明有误
xx += dir[i][];//继续往这方向遍历
yy += dir[i][];
}
}
}
return true;
}
int f(int x)//返回子集中的size
{
int tot = ;
for(int i = ; i < (n * n); i++)
{
if(x & ( << i))tot++;
}
return tot;
}
int main()
{
while(cin >> n && n)
{
int ans = ;
for(int i = ; i < n; i++)cin >> a[i];
for(int i = ; i < ( << (n * n)); i++)
{
if(judge(i))ans = max(ans, f(i));//更新最优解
}
cout << ans << endl;
}
return ;
}

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

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. ES6的generator函数

    generator是什么? generator是ES6提供的一种异步编程解决方案,在语法上,可以把它理解为一个状态机,内部封装了多种状态.执行generator,会生成返回一个遍历器对象.返回的遍历器 ...

  2. async generator promise异步方案实际运用

    es7 async方案 /******************async***********************/ var timeFn=function(time){ return new P ...

  3. js中==和===区别

    简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换 ...

  4. 一、Android四大框架之ContentProvider的学习与运用,实现SQLite的增删改查。

    本文系原创博客,文中不妥烦请指出,如需转载摘要请注明出处! ContentProvider的学习与运用 Alpha Dog 2016-04-13  10:27:06 首先,项目的地址:https:// ...

  5. JVM学习五:JVM之类加载器之编译常量和主动使用

    在学习了前面几节的内容后,相信大家已经对JAVA 虚拟机 加载类的过程有了一个认识和了解,那么本节,我们就继续进一步巩固前面所学知识和特殊点. 一.类的初始化回顾 类在初始化的时候,静态变量的声明语句 ...

  6. STL --> list用法

    List介绍 Lists将元素按顺序储存在链表中.与 向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢. assign() // 给list赋值 back() // 返回最后 ...

  7. Matlab绘图基础——图形修饰处理(入门)

    引入--标题.色条.坐标轴.图例等 例一: set(groot,'defaultAxesLineStyleOrder','remove','defaultAxesColorOrder','remove ...

  8. NSURLSession http转Https

    1.设置代理 NSURLSession *sesson = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defa ...

  9. 火狐浏览器中如何删除保存的cookie

    大致分为三步即可: 打开浏览器并查看图示,按照图示操作即可完成:

  10. 『BUG』Android Studio 64位 始终提示 JVM 启动不了,JDK配置失败,error code -1

    前几天 安装了 Android Studio 2.2. 本来一切都好,但是当我修改了 配置文件 studio64.exe.vmoptions 想修改 最大内存(保证运行流畅)后,AS 就再也运行不了了 ...