BZOJ P4554 [Tjoi2016&Heoi2016]游戏


题目

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


题解

经典的二分图……

我们把图拆分为横竖两个方向的图并将行、列上连续的做编号

然后把可放炸弹的地方取出来,对该点的行、列编号上建边,做一遍匈牙利就可以了

然而,我临界表上有点失误,WA了几次……


代码

#include<cstdio>
#include<cstring>
using namespace std;int n,m,tot,ans,now;
int lnk[1255],s[1255],l[55][55],r[55][55],map[55][55];
char ch;
bool vis[1255];
struct edge
{int nxt,y;
} e[1600005];void add(int x,int y)
{tot++;e[tot].nxt=lnk[x];lnk[x]=tot;e[tot].y=y;
}bool dfs(int x)
{for (int i=lnk[x];i;i=e[i].nxt){if (!vis[e[i].y]){vis[e[i].y]=true;if (!s[e[i].y]||dfs(s[e[i].y])){s[e[i].y]=x;return true;}}}return false;
}int main()
{scanf("%d%d",&n,&m);for (int i=1;i<=n;i++)for (int j=1;j<=m;j++){ch=getchar();while (ch!='#'&&ch!='x'&&ch!='*') ch=getchar();if (ch=='#') map[i][j]=2;else if (ch=='x') map[i][j]=1;else if (ch=='*') map[i][j]=0;}for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (map[i][j]==2||j==1) now++,l[i][j]=now;else l[i][j]=now;for (int j=1;j<=m;j++)for (int i=1;i<=n;i++)if (map[i][j]==2||i==1) tot++,r[i][j]=tot;else r[i][j]=tot;tot=0;for (int i=1;i<=n;i++)for (int j=1;j<=m;j++)if (map[i][j]==0) add(l[i][j],r[i][j]);memset(s,0,sizeof(s));for (int i=1;i<=now;i++){memset(vis,false,sizeof(vis));if (dfs(i)) ans+=1;} printf("%d",ans);return 0;
}

BZOJ P4554 [Tjoi2016Heoi2016]游戏相关推荐

  1. BZOJ 1443: [JSOI2009]游戏Game

    1443: [JSOI2009]游戏Game Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1077  Solved: 484 [Submit][S ...

  2. ●BZOJ 4556 [Tjoi2016Heoi2016]字符串

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=4556 题解: 巨恶心...但是题很好呀,可以练习好几个比较麻烦的算法~ 1).预处理 首先用 ...

  3. bzoj 4515: [Sdoi2016]游戏

    Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,Alice 会 ...

  4. bzoj#4555. [Tjoi2016Heoi2016]求和

    bzoj#4555. [Tjoi2016&Heoi2016]求和 题目描述 Solution 有一个关于第二类斯特林数的公式: {nm}=1m!∑i(mk)(m−k)n(−1)k\left\{ ...

  5. BZOJ 1854: [Scoi2010]游戏( 二分图最大匹配 )

    匈牙利算法..从1~10000依次找增广路, 找不到就停止, 输出答案. --------------------------------------------------------------- ...

  6. [BZOJ] 1025 [SCOI2009]游戏

    Time Limit: 1 Sec Memory Limit: 162 MB Submit: 2700 Solved: 1774 [Submit][Status][Discuss] Descripti ...

  7. BZOJ 1025: [SCOI2009]游戏

    1025: [SCOI2009]游戏 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 2471  Solved: 1615 [Submit][Statu ...

  8. bzoj 1854: [Scoi2010]游戏(并查集)

    1854: [Scoi2010]游戏 Time Limit: 5 Sec  Memory Limit: 162 MB Submit: 5265  Solved: 2101 [Submit][Statu ...

  9. bzoj 2121 字符串游戏

    BX正在进行一个字符串游戏,他手上有一个字符串L,以及其他一些字符串的集合S,然后他可以进行以下操作:对于一个在集合S中的字符串p,如果p在L中出现,BX就可以选择是否将其删除,如果删除,则将删除后L ...

最新文章

  1. 使用C# 3.0编译器编译 Asp.Net 项目代码
  2. 学籍管理系统 c语言流程图,程序设计基础 ——C语言第10章 综合应用案例——学生学籍管理系统...
  3. springboot配置https访问
  4. PHP session的工作原理
  5. ffmpeg,rtmpdump和nginx rtmp实现录屏,直播和录制
  6. iOS 14.0.1修复五大问题,无法连接Wi-Fi已经解决
  7. POJ-1328 Radar Installation 贪心
  8. 【毕业答辩】你的论文答辩PPT准备好了吗?
  9. 处理增删改_实现数据的增删改查
  10. 简单的实现了Dijkstra,
  11. java编辑简单文本编辑器_简单文本编辑器
  12. Origin简单绘图
  13. 黑客6种方法入侵你的计算机系统
  14. matlab四面体网格分割,分割球面
  15. 若依源码分析(14)——数据监控
  16. 计算机体系结构 ---- flynn 分类
  17. 个人新出的书籍---《云计算网络珠玑》
  18. 计算机演示题打不开,win7系统电脑上的ppt打不开怎么修复|ppt打不开的四种修复方法...
  19. 企企通采购网“企销通2.0”重磅上线 助力中小企业打通数字化生态
  20. torch.sequeeze 和 torch.unsequeeze 的用法

热门文章

  1. 【微信小程序控制硬件15 】 开源一个微信小程序,支持蓝牙快速配网+WiFi双控制ESP32-C3应用示范;(附带Demo)
  2. ithoughts怎么自定义样式_iThoughts 5怎么绘制流程图 绘制流程图教程
  3. java面试之JVM和GC
  4. 算法学习 - 二分法
  5. php 画图(主要采用的是php的GD库) copy直接用
  6. 大龄程序员都去哪了?分享我身边的几个故事
  7. 读书笔记-看见未来:改变互联网世界的人们
  8. [四] WPF灵魂-Binding
  9. 求n维空间点的距离(改进版)
  10. android 打开各种文件的方式