hdu1045 Fire Net---二进制枚举子集
题目链接:
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---二进制枚举子集的更多相关文章
- UVA1354-Mobile Computing(二进制枚举子集)
Problem UVA1354-Mobile Computing Accept:267 Submit:2232 Time Limit: 3000 mSec Problem Description ...
- 紫书 例题 11-3 UVa 1151 (有边集的最小生成树+二进制枚举子集)
标题指的边集是说这道题的套餐, 是由几条边构成的. 思路是先做一遍最小生成树排除边, 因为如果第一次做没有加入的边, 到后来新加入了很多权值为0的边,这些边肯定排在最前面,然后这条边的前面的那些边肯定 ...
- UVA - 1151 Buy or Build (买还是建)(并查集+二进制枚举子集)
题意:平面上有n个点(1<=n<=1000),你的任务是让所有n个点连通.可以新建边,费用等于两端点欧几里德距离的平方.也可以购买套餐(套餐中的点全部连通).问最小费用. 分析: 1.先将 ...
- BZOJ1688|二进制枚举子集| 状态压缩DP
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...
- 杭电多校第十场 hdu6435 CSGO 二进制枚举子集
CSGO Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Subm ...
- UVA 1151二进制枚举子集 + 最小生成树
题意:平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此, 你可以新建一些边,费用等于两个端点的欧几里得距离的平方.另外还有q(0<=q<=8)个套餐(数 ...
- 南阳OJ-91-阶乘之和---二进制枚举(入门)
题目链接:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=91 题目大意: 给你一个非负数整数n,判断n是不是一些数(这些数不允许重复使用,且为 ...
- POJ 3279 Fliptile(反转 +二进制枚举)
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13631 Accepted: 5027 Descrip ...
- 算法笔记-- 二进制集合枚举子集 && 求子集和 && 求父集和
枚举子集: 复杂度:O(2^k) )&s); 用sos dp求解子集和以及父集和 子集和: ; i <= k; i--) { ; mask < (<<k); mask+ ...
随机推荐
- Tomcat使用基础
1.解压Tomcat压缩文件后需要在环境变量里配置 :TOMCAT_HOME:D:\apache-tomcat-8.0.35. 2.将打好的项目war包放到tomcat安装目录的webapps文件夹下 ...
- thinkphp3.2-更改控制器名后找不到相应的表?报1146的错
用tp在做着自己的小系统的时候,明明在刚才还是能好好地查到表的,在Service用了'D'方法连自己数据库的表,只是更改了自己的控制器名,却报错了... 我就纳闷了,虽然我的控制器和Service用的 ...
- Gradient Descent
理自Andrew Ng的machine learning课程. 目录: 梯度下降算法 梯度下降算法的直观展示 线性回归中的梯度下降 前提: 线性回归模型 :$h(\theta_0,\theta_1)= ...
- Java获取键盘输入
方法一:在控制台接收字符串并将其打印出来,使用BufferedReader和InputStreamReader类实现 import java.io.*; public class Demo { pub ...
- spring boot 启动问题
spring boot启动报错误 Thread-2] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.co ...
- 【Python&数据结构】 抽象数据类型 Python类机制和异常
这篇是<数据结构与算法Python语言描述>的笔记,但是大头在Python类机制和面向对象编程的说明上面.我也不知道该放什么分类了..总之之前也没怎么认真接触过基于类而不是独立函数的Pyt ...
- 自己开发的 vue 滑动按钮组件 vue-better-slider
写在前面的 这个人第一次尝试开发并发布一个 vue 的组件,该组件实现了类似 ios 手机淘宝客户端 -> 消息界面中消息的滑动删除功能等,如下为该组件的文档. 一个 Vue 的滑动按钮组件,有 ...
- dom4j 最常用最简单的用法(转)
要使用dom4j读写XML文档,需要先下载dom4j包,dom4j官方网站在 http://www.dom4j.org/目前最新dom4j包下载地址:http://nchc.dl.sourceforg ...
- 查看端口使用情况(lsof,netstat, kill)
在Mac上查看端口使用情况只能使用lsof(list open file),无法使用 netstat. 查看某个端口是否正在被占用: lsof -i:portno 另外,可以通过: lsof 指令来查 ...
- SSH相关知识
SSH(Secure Shell, 安全Shell协议)是一种加密的网络传输协议,经常用于安全的远程登录. SSH只是一种协议,可以有多种实现. OPENSSH是一种应用广泛的实现. sshd是dae ...