题目

链接

在一个$n \times m$方格地图上,某些方格上放置着炸弹。手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去。

现在为了引爆地图上的所有炸弹,需要手动引爆其中一些炸弹,为了把危险程度降到最低,请算出最少手动引爆多少个炸弹可以把地图上的所有炸弹引爆。

解决方案

由于炸弹连锁,问题等价于求图中的联通块,只是此处的不只是相邻的炸弹联通,同行或同列也是广义的联通。

值得注意的是,寻找“相邻”炸弹时不能挨个查找(会超时),需要先预处理每个炸弹的“东”、“西”、“南”、“北”相邻炸弹的位置。

 #include<bits/stdc++.h>
using namespace std; const int maxn = + ;
const int maxm = + ;
int n,m;
bool maze[maxn][maxm];
bool r[maxn], c[maxm];
char s[maxm];
int dn[maxn][maxm], ds[maxn][maxm], dw[maxn][maxm], de[maxn][maxm]; void init()
{
//memset(dn, -1, sizeof(dn));
//memset(ds, -1, sizeof(ds));
//memset(dw, -1, sizeof(dw));
//memset(de, -1, sizeof(de));
for(int j = ;j < m;j++)
{
int flagn = -;
for(int i = ;i < n;i++)
{
dn[i][j] = flagn;
if(maze[i][j] == ) flagn = i;
}
} for(int j = ;j < m;j++)
{
int flags = -;
for(int i = n-;i >= ;i--)
{
ds[i][j] = flags;
if(maze[i][j] == ) flags = i;
}
} for(int i = ;i < n;i++)
{
int flagw = -;
for(int j = ;j < m;j++)
{
dw[i][j] = flagw;
if(maze[i][j] == ) flagw = j;
}
} for(int i = ;i < n;i++)
{
int flage = -;
for(int j = m - ;j >= ;j--)
{
de[i][j] = flage;
if(maze[i][j] == ) flage = j;
}
}
} int cnt = ;
void dfs(int i, int j)
{
//printf("%d %d\n", i, j);
maze[i][j] = ;
r[i] = c[j] = true; if(dn[i][j] != - && maze[dn[i][j]][j] == ) dfs(dn[i][j], j);
if(ds[i][j] != - && maze[ds[i][j]][j] == ) dfs(ds[i][j], j);
if(dw[i][j] != - && maze[i][dw[i][j]] == ) dfs(i, dw[i][j]);
if(de[i][j] != - && maze[i][de[i][j]] == ) dfs(i, de[i][j]); } int main()
{
scanf("%d%d", &n,&m);
for(int i = ;i < n;i++)
{
scanf("%s", s);
for(int j = ;j < m;j++) maze[i][j] = s[j] - '';
} init(); int ans = ;
for(int i = ;i <n;i++)
for(int j = ;j < m;j++)
{
if(maze[i][j] == && (!r[i]) && (!c[j])) //出现过的行和列肯定不可能再存在“未爆炸”的炸弹
{
dfs(i, j);
ans++;
}
}
printf("%d\n", ans); return ;
}

引爆炸弹——DFS&&联通块的更多相关文章

  1. Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)

    题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...

  2. 蓝桥杯模拟赛-引爆炸弹-DFS+并查集

    今天整理电脑,翻出来了很久以前大佬给的题,贴一下. 引爆炸弹 1000ms 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸 ...

  3. Codeforces277A 【dfs联通块】

    题意: 给出n个人会的语言类型,然后问这n个人里面还需要几个人学习一下语言就可以n个直接互通了.a会1,2,b会2,3,c会4,那么只要C学一下1或者2,或者3就好了...大致就是这个意思. 思路: ...

  4. hdoj2952【DFS联通块】

    我觉得还是这种不带回溯的直接搜到底的好玩啊!!!但是要注意边界,记得以前四周要空出来的一道题目,被坑了很久,还是wa到比赛结束!!!这道还是基础题 类似的基础题:POJ1562 hdoj1016 po ...

  5. Codeforces Round #369 (Div. 2) D. Directed Roads dfs求某个联通块的在环上的点的数量

    D. Directed Roads   ZS the Coder and Chris the Baboon has explored Udayland for quite some time. The ...

  6. HDU - 1213 dfs求联通块or并查集

    思路:给定一个无向图,判断有几个联通块. AC代码 #include <cstdio> #include <cmath> #include <algorithm> ...

  7. 【紫书】Oil Deposits UVA - 572 dfs求联通块

    题意:给你一个地图,求联通块的数量. 题解: for(所有还未标记的‘@’点) 边dfs边在vis数组标记id,直到不能继续dfs. 输出id及可: ac代码: #define _CRT_SECURE ...

  8. 分别利用并查集,DFS和BFS方法求联通块的数量

    联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m ...

  9. 蓝桥杯模拟赛 引爆炸弹-并查集+DFS

    引爆炸弹 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹, ...

随机推荐

  1. (模板)poj2387(dijkstra+优先队列优化模板题)

    题目链接:https://vjudge.net/problem/POJ-2387 题意:给n个点(<=1000),m条边(<=2000),求结点n到结点1的最短路. 思路:dijkstra ...

  2. 1.3.3 并发容器类MAP/LIST/SET/QUEUE

    HashMap 下标计算方法:hashCode & (length-1) ,&按位与操作,二进制相同位都是1,该位才为1 JDK1.7与JDK1.8中HashMap区别: JDK1.8 ...

  3. Double write Buffer的配置

    InnoDB和XtraDB使用称为doublewrite缓冲区的特殊功能来提供数据损坏的强大保证.想法是在写入数据文件之前将数据写入主表空间中的顺序日志.如果发生部分页面写入(换句话说,写入损坏),I ...

  4. GCD&&素筛&&快速幂 --A - Pseudoprime numbers

    Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). Th ...

  5. Python初学者常见错误详解

    Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:”   if spam == 42 print('Hello ...

  6. idea 编辑器Git暂存区的使用

    平时在开发时候 一般线上环境和线下环境区别会很大,所以一下线下的自己测试环境的代码没有如果提交会影响线上环境,所以一般都会使用git的一个暂存区作为临时存放不需要提交的代码,这样每次提交代码都可以在不 ...

  7. shell使用ps -ef|grep xxx时不显示grep xxx进程的方法

    在使用ps -ef|grep xxx时会将grep xxx的进程也带出来, 而在脚本中如果想要截取此命令结果的一部分,则grep xxx的进程会显得多余,如下: [root@localhost ~]# ...

  8. 补充第11期作业:Long.fastUUID与UUID.toString之间的关系

    一 UUID.toString方法与Long.fastUUID方法的关联 UUID类 public final class UUID implements java.io.Serializable, ...

  9. Vue大概知识体系和学习参考

    Vue大概知识体系和学习参考文档 官方文档学习,参考,借鉴地址:https://cn.vuejs.org/v2/guide/installation.html 菜鸟教程:https://www.run ...

  10. 6.单表的CRUD操作

    1.插入后用新id初始化被插入对象 <insert id="insertStudentCatchId"> insert into student (age,name,s ...