当前位置: 首页 > news >正文

[BZOJ4554][TJOI2016HEOI2016]游戏(匈牙利)

4554: [Tjoi2016&Heoi2016]游戏

Time Limit: 20 Sec  Memory Limit: 128 MB
Submit: 857  Solved: 506
[Submit][Status][Discuss]

Description

在2016年,佳缘姐姐喜欢上了一款游戏,叫做泡泡堂。简单的说,这个游戏就是在一张地图上放上若干个炸弹,看
是否能炸到对手,或者躲开对手的炸弹。在玩游戏的过程中,小H想到了这样一个问题:当给定一张地图,在这张
地图上最多能放上多少个炸弹能使得任意两个炸弹之间不会互相炸到。炸弹能炸到的范围是该炸弹所在的一行和一
列,炸弹的威力可以穿透软石头,但是不能穿透硬石头。给定一张n*m的网格地图:其中*代表空地,炸弹的威力可
以穿透,可以在空地上放置一枚炸弹。x代表软石头,炸弹的威力可以穿透,不能在此放置炸弹。#代表硬石头,炸
弹的威力是不能穿透的,不能在此放置炸弹。例如:给出1*4的网格地图*xx*,这个地图上最多只能放置一个炸弹
。给出另一个1*4的网格地图*x#*,这个地图最多能放置两个炸弹。现在小H任意给出一张n*m的网格地图,问你最
多能放置多少炸弹

Input

第一行输入两个正整数n,m,n表示地图的行数,m表示地图的列数。1≤n,m≤50。接下来输入n行m列个字符,代表网
格地图。*的个数不超过n*m个

Output

输出一个整数a,表示最多能放置炸弹的个数

Sample Input

```
4 4
#***
*#**
**#*
xxx#
```

Sample Output

5

HINT

Source

TJOI2016的题目都是联赛难度的,但我还是做得令人很不满意,说明在基础算法方面有很大欠缺,不能再本末倒置了。

这题是比较经典的二分图模型,对于每个可以放炸弹的格子,x->y连一条边,这样跑最大匹配之后就能保证任意两个炸弹不在同一行或同一列内了。

但是硬石头怎么办呢,很简单直接将行和列拆成两边,新建节点即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define mem(a) memset(a,0,sizeof(a))
 5 #define rep(i,l,r) for (int i=l; i<=r; i++)
 6 using namespace std;
 7 
 8 const int N=2510;
 9 int n,m,tx,ty,now,ans,cnt;
10 int to[N],nxt[N],h[N],lnk[N],vis[N],bel[60][60];
11 char str[60][60];
12 
13 void add(int a,int b){ to[++cnt]=b; nxt[cnt]=h[a]; h[a]=cnt; }
14 
15 int dfs(int x){
16     for (int i=h[x],k; i; i=nxt[i]) if (!vis[k=to[i]]){
17         vis[k]=1;
18         if (!lnk[k] || dfs(lnk[k])) { lnk[k]=x; return 1; }
19     }
20     return 0;
21 }
22 
23 int main(){
24     freopen("bzoj4554.in","r",stdin);
25     freopen("bzoj4554.out","w",stdout);
26     scanf("%d%d",&n,&m); tx=ty=1;
27     rep(i,1,n){
28         scanf("%s",str[i]+1);
29         rep(j,1,m) if (str[i][j]=='#') tx++; else bel[i][j]=tx;
30         if (str[i][m]!='#') tx++;
31     }
32     rep(j,1,m){
33         rep(i,1,n){
34             if (str[i][j]=='#') ty++;
35             if (str[i][j]=='*') add(bel[i][j],ty);
36         }
37         if (str[n][j]!='#') ty++;
38     }
39     rep(x,1,tx) mem(vis),ans+=dfs(x);
40     printf("%d\n",ans);
41     return 0;
42 }

 

转载于:https://www.cnblogs.com/HocRiser/p/8580231.html

相关文章:

  • POJ 1147 Binary Codes 杂题
  • 浅谈过去,畅想未来
  • POJ 2286 The Rotation Game IDA*
  • LeetCode 67. Add Binary
  • HDU 4016 Magic Bitwise And Operation 暴搜+剪枝
  • 20165314 2016-2017-2 《Java程序设计》第3周学习总结
  • HDU 4090 GemAnd Prince 暴搜+剪枝
  • XML作用
  • ReportViewer:隐藏和GetDefaultPageSettings
  • ETL总结(扫盲版)
  • sql server 内置MD5加密函数
  • POJ 1011 Sticks 强大的剪枝
  • 2018/3/20 noip模拟赛 5分
  • windows2003 with OpenSSH
  • java和c#通过esb服务互调用组件
  • 【笔记】你不知道的JS读书笔记——Promise
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • fetch 从初识到应用
  • HTTP中GET与POST的区别 99%的错误认识
  • java 多线程基础, 我觉得还是有必要看看的
  • Joomla 2.x, 3.x useful code cheatsheet
  • leetcode-27. Remove Element
  • Linux gpio口使用方法
  • mysql 5.6 原生Online DDL解析
  • uni-app项目数字滚动
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 后端_ThinkPHP5
  • 力扣(LeetCode)22
  • 时间复杂度与空间复杂度分析
  • 数组大概知多少
  • 学习HTTP相关知识笔记
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​configparser --- 配置文件解析器​
  • ​Spring Boot 分片上传文件
  • #includecmath
  • $$$$GB2312-80区位编码表$$$$
  • (30)数组元素和与数字和的绝对差
  • (6)添加vue-cookie
  • (70min)字节暑假实习二面(已挂)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (分布式缓存)Redis持久化
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (算法)求1到1亿间的质数或素数
  • (一)为什么要选择C++
  • .gitignore
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .Net6 Api Swagger配置
  • .Net的DataSet直接与SQL2005交互
  • .NET开源快速、强大、免费的电子表格组件
  • [ Linux ] Linux信号概述 信号的产生