【BZOJ4554】[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

题解:将行和列看成点,格子看成边,每有一个硬石头就将改行(列)拆开,新建一个,然后跑最大匹配

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int to[2510],next[2510],head[2510],from[2510],vis[2510];
int bel[60][60];
int n,m,tx,ty,now,ans,cnt;
char str[60][60];
void add(int a,int b)
{
to[cnt]=b;
next[cnt]=head[a];
head[a]=cnt++;
}
int dfs(int x)
{
for(int i=head[x];i!=-1;i=next[i])
{
if(vis[to[i]]==now) continue;
vis[to[i]]=now;
if(!from[to[i]]||dfs(from[to[i]]))
{
from[to[i]]=x;
return 1;
}
}
return 0;
}
int main()
{
scanf("%d%d",&n,&m);
int i,j;
memset(head,-1,sizeof(head));
tx=ty=1;
for(i=1;i<=n;i++)
{
scanf("%s",&str[i]);
for(j=1;j<=m;j++)
{
if(str[i][j-1]=='#') tx++;
else bel[i][j]=tx;
}
if(str[i][m-1]!='#') tx++;
}
for(j=1;j<=m;j++)
{
for(i=1;i<=n;i++)
{
if(str[i][j-1]=='#') ty++;
if(str[i][j-1]=='*') add(bel[i][j],ty);
}
if(str[n][j-1]!='#') ty++;
}
for(now=1;now<=tx;now++) ans+=dfs(now);
printf("%d",ans);
return 0;
}

最新文章

  1. sql SYS对象集合
  2. weinre使用
  3. C++中实现对象的clone()
  4. js循环的总结
  5. [Architecture Design] CLK Architecture
  6. Win7下:编译器错误信息: CS0016: 未能写入输出文件
  7. HTTP 错误 500.19 - Internal Server Error 无法访问请求的页面,因为该页的相关配置数据无效。
  8. A+B for Matrices 及 C++ transform的用法
  9. Linux下18b20温度传感器驱动代码及测试实例
  10. tomcat加载不了spring-webjar终极解决办法
  11. hdu1238--Substrings
  12. IOS系列——NStimer
  13. Effective C++规定45 附加代码
  14. 傲梅分区助手专业版 v6.2 中文免费版
  15. 用ftplib爆破FTP口令
  16. 统计numpy数组中最频繁出现的值
  17. win10自动更新后SQLServer无法启动的问题排查
  18. Zookeeper使用--命令行
  19. Linux LVM 逻辑分区
  20. wrap

热门文章

  1. java- ★学习资源★
  2. 关于Struts2有时候出现的莫名其妙的错误
  3. (转)非阻塞Connect对于select时应注意问题
  4. 【Java NIO的深入研究】 ServerSocketChannel
  5. J2SE基础:8.系统经常使用类二
  6. c++ ifstream
  7. 学习 TList 类的实现[3] - 不能回避的话题: 内存分配
  8. apache基金会开源项目简介
  9. mysql中,如何查看数据库中当前可用的校勘?字符集默认的collation?
  10. mysql中如何在命令行中,执行一个SQL脚本文件?