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+ ...
随机推荐
- 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 ...
- RxJS速成 (下)
上一部分: http://www.cnblogs.com/cgzl/p/8641738.html Subject Subject比较特殊, 它即是Observable又是Observer. 作为Obs ...
- java-线程实现方式
实现方式: 1,继承Thread类 public class ThreadTest extends Thread { @Override public void run() { System.out. ...
- Gitlab - Pull Request
1.概述 今天查看Gmail,有网友私密我Gitlab的Pull Request工作流程,一直以为我写过这片博客,查看<Git和Gitlab协同工作>却发现遗漏了Pull Request这 ...
- 数据库 --> sqlite3总结
Sqlite3总结 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. sqlite语句 #sqlite3 test.db //设置宽度为2sqlit ...
- 1077. Kuchiguse (20)
The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...
- iptables.sh 初始化防火墙配置
#!/bin/bash iptables -F iptables -X iptables -Z iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT ...
- python(练习实例)
Python 练习实例1 题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 我的代码:python 3+ #2017-7-20 list_h = [1,2,3,4 ...
- echarts地图的引用
最近是跟echarts杠上了 所在公司是搞数据的 所以身为前端的我 就必须使用echarts将数据展示出来 ,进公司一周 ,前前后后大概用了八九种echarts图,我举得最难的就是引用的地图,因为刚开 ...
- Python开发简单爬虫(二)---爬取百度百科页面数据
一.开发爬虫的步骤 1.确定目标抓取策略: 打开目标页面,通过右键审查元素确定网页的url格式.数据格式.和网页编码形式. ①先看url的格式, F12观察一下链接的形式;② 再看目标文本信息的标签格 ...