当前位置: 首页 > 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服务互调用组件
  • 深入了解以太坊
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【剑指offer】让抽象问题具体化
  • 230. Kth Smallest Element in a BST
  • bearychat的java client
  • CSS魔法堂:Absolute Positioning就这个样
  • Java的Interrupt与线程中断
  • Markdown 语法简单说明
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 记一次删除Git记录中的大文件的过程
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 利用jquery编写加法运算验证码
  • 面试遇到的一些题
  • #大学#套接字
  • (39)STM32——FLASH闪存
  • (4)STL算法之比较
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (第一天)包装对象、作用域、创建对象
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (利用IDEA+Maven)定制属于自己的jar包
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (一) storm的集群安装与配置
  • (转)setTimeout 和 setInterval 的区别
  • (转)winform之ListView
  • (转)德国人的记事本
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET基础篇——反射的奥妙
  • .NET序列化 serializable,反序列化
  • .net中的Queue和Stack
  • .net中生成excel后调整宽度
  • @Autowired和@Resource的区别
  • [<MySQL优化总结>]
  • [Android]使用Android打包Unity工程
  • [Android实例] 保持屏幕长亮的两种方法 [转]
  • [C#基础]说说lock到底锁谁?