hdu 3529 Bomberman - Just Search! 重复覆盖
依然是重复覆盖的模板....
- #include<bits/stdc++.h>
- using namespace std;
- #define pb(x) push_back(x)
- #define ll long long
- #define mk(x, y) make_pair(x, y)
- #define lson l, m, rt<<1
- #define mem(a) memset(a, 0, sizeof(a))
- #define rson m+1, r, rt<<1|1
- #define mem1(a) memset(a, -1, sizeof(a))
- #define mem2(a) memset(a, 0x3f, sizeof(a))
- #define rep(i, a, n) for(int i = a; i<n; i++)
- #define ull unsigned long long
- typedef pair<int, int> pll;
- const double PI = acos(-1.0);
- const double eps = 1e-;
- const int mod = 1e9+;
- const int inf = ;
- const int dir[][] = { {-, }, {, }, {, -}, {, } };
- const int maxn = ;
- const int maxNode = ;
- struct DLX {
- int L[maxNode], R[maxNode], U[maxNode], D[maxNode], row[maxNode], col[maxNode];
- int S[maxn], H[maxn], deep, ans[maxn], sz, n, m;
- void remove(int c) {
- for(int i = D[c]; i!=c; i = D[i]) {
- L[R[i]] = L[i];
- R[L[i]] = R[i];
- }
- }
- void resume(int c) {
- for(int i = U[c]; i!=c; i = U[i]) {
- L[R[i]] = i;
- R[L[i]] = i;
- }
- }
- int h() {
- int cnt = ;
- int vis[];
- mem(vis);
- for(int i = R[]; i!=; i = R[i]) {
- if(!vis[i]) {
- cnt++;
- vis[i] = ;
- for(int j = D[i]; j!=i; j = D[j]) {
- for(int k = R[j]; k!=j; k = R[k]) {
- vis[col[k]] = ;
- }
- }
- }
- }
- return cnt;
- }
- void dfs(int d) {
- if(d+h()>=deep)
- return ;
- if(R[] == ) {
- deep = min(deep, d);
- return ;
- }
- int c = R[];
- for(int i = R[]; i!=; i = R[i])
- if(S[c]>S[i])
- c = i;
- for(int i = D[c]; i!=c; i = D[i]) {
- remove(i);
- for(int j = R[i]; j!=i; j = R[j])
- remove(j);
- dfs(d+);
- for(int j = L[i]; j!=i; j = L[j])
- resume(j);
- resume(i);
- }
- return ;
- }
- void add(int r, int c) {
- sz++;
- row[sz] = r;
- col[sz] = c;
- S[c]++;
- U[sz] = U[c];
- D[sz] = c;
- D[U[c]] = sz;
- U[c] = sz;
- if(~H[r]) {
- R[sz] = H[r];
- L[sz] = L[H[r]];
- L[R[sz]] = sz;
- R[L[sz]] = sz;
- } else {
- H[r] = L[sz] = R[sz] = sz;
- }
- }
- void init(){
- mem1(H);
- deep = inf;
- for(int i = ; i<=n; i++) {
- R[i] = i+;
- L[i] = i-;
- U[i] = i;
- D[i] = i;
- }
- mem(S);
- R[n] = ;
- L[] = n;
- sz = n;
- }
- int gra[][];
- void solve() {
- char g[][];
- for(int i = ; i<n; i++) {
- scanf("%s", g[i]);
- }
- int cnt = ;
- for(int i = ; i<n; i++) {
- for(int j = ; j<m; j++) {
- if(g[i][j]=='*')
- gra[i][j] = -;
- if(g[i][j] == '.')
- gra[i][j] = ;
- if(g[i][j] == '#')
- gra[i][j] = ++cnt;
- }
- }
- int r = , tmp = n;
- n = cnt;
- init();
- for(int i = ; i<tmp; i++) {
- for(int j = ; j<m; j++) {
- if(!gra[i][j]) {
- r++;
- for(int k = ; k<; k++) {
- int tmpx = i, tmpy = j;
- while() {
- tmpx += dir[k][];
- tmpy += dir[k][];
- if(gra[tmpx][tmpy]) {
- if(gra[tmpx][tmpy]>) {
- add(r, gra[tmpx][tmpy]);
- }
- break;
- }
- }
- }
- }
- }
- }
- dfs();
- cout<<deep<<endl;
- }
- }dlx;
- int main()
- {
- int n, m;
- while(~scanf("%d%d", &dlx.n, &dlx.m)) {
- dlx.solve();
- }
- return ;
- }
hdu 3529 Bomberman - Just Search! 重复覆盖的更多相关文章
- HDU 5046 Airport【DLX重复覆盖】
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5046 题意: 给定n个城市的坐标,要在城市中建k个飞机场,使城市距离最近的飞机场的最长距离最小,求这 ...
- HDU 3335 Divisibility dancing links 重复覆盖
分析: dlx重复覆盖的巧用,重复覆盖的原理恰好符合本题的筛选方式,即选择一个数后,该数的倍数或约数可以保证在之后的搜索中不会被选择 于是修改一下启发函数,求解最大的重复覆盖即可. 其实不一定不被 ...
- HDU 2295 Radar dancing links 重复覆盖
就是dancing links 求最小支配集,重复覆盖 精确覆盖时:每次缓存数据的时候,既删除行又删除列(这里的删除列,只是删除表头) 重复覆盖的时候:只删除列,因为可以重复覆盖 然后重复覆盖有一个估 ...
- [ACM] HDU 2295 Radar (二分法+DLX 重复覆盖)
Radar Problem Description N cities of the Java Kingdom need to be covered by radars for being in a s ...
- hdu 4735Little Wish~ lyrical step~ 重复覆盖
题目链接 给出一棵树, 树上点的值为0或1, 可以交换树上两个点的权值, 给出一个距离m, 所有的0距离最近的1的距离不能超过m, 求最少的交换次数. 首先对于每一个点u,所有离u的距离不超过m的点v ...
- HDU 2295 Radar (重复覆盖)
Radar Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- HDU 3957 Street Fighter(搜索、DLX、重复覆盖+精确覆盖)
很久以前就看到的一个经典题,一直没做,今天拿来练手.街霸 给n<=25个角色,每个角色有 1 or 2 个版本(可以理解为普通版以及爆发版),每个角色版本可以KO掉若干人. 问最少选多少个角色( ...
- HDU 2295.Radar (DLX重复覆盖)
2分答案+DLX判断可行 不使用的估计函数的可重复覆盖的搜索树将十分庞大 #include <iostream> #include <cstring> #include < ...
- hdu 5046 Airport 二分+重复覆盖
题目链接 给n个点, 定义两点之间距离为|x1-x2|+|y1-y2|. 然后要选出k个城市建机场, 每个机场可以覆盖一个半径的距离. 求在选出点数不大于k的情况下, 这个半径距离的最大值. 二分半径 ...
随机推荐
- JS继承,原型继承,构造函数的继承,非构造函数"的继承
a.原型继承 一.new运算符的缺点 用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法.比如,在DOG对象的构造函数中,设置一个实例对象的共有属性species. function DOG ...
- ASP.NET不通过添加web引用的方式调用web service接口
尊重原著作:本文转载自http://bbs.csdn.net/topics/360223969 创建方法 //动态调用web服务 public static object InvokeWebSer(s ...
- House Robber & House Robber II
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- Linux学习之sed命令详解
概述 sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区 ...
- mysql触发器使用注意
1.在创建触发器的时候,语句中避免在一个select语句查询多个列,例如使用select a,b from table,应该分开使用select语句, 例如select a from table s ...
- VB EditGrid的用法
百度了一下,关于vb 6.0 EditGrid的用法 查不到资料
- mini-httpd源码分析-match.h
//字符串匹配,匹配返回 1,否则返回 0. //pattern可以通过任意个 | 字符,组合match_one中pattern的功能 int match(const char* pattern, c ...
- c/c++实现混合编程
在开发中大家经常会使用到c与c++混合编程,这样能够更好的实现功能模块.刚学习了一下c和c++的混合编程,参考了网上的相关知识,在这里留下要点,方便以后进行查阅. 1.extern关键字 extern ...
- rsyslog 传输mysql 日志
在另外一种环境中,让我们假定你已经在机器上安装了一个名为"foobar"的应用程序,它会在/var/log下生成foobar.log日志文件.现在,你想要将它的日志定向到rsysl ...
- c++游戏编程书籍
如果要自学游戏程序开发的话,可以看看下面的,呵呵. 游戏开发资料(PDF书都是中文版的,非英文,很多是本人自己扫描制作,从未网上发布过,所以独家啦): 1.Gamebryo 2.2游戏引擎(盛大.腾 ...