题目

链接

在一个$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. zotero入门简介

    文献管理工具必备的功能:word文档中插入文献引用,自动生成参考文献列表. 支持系统:windows, linux, macOS. 费用:免费提供300M以内文献库存储容量. 其他:支持笔记,条目附件 ...

  2. java中拦截器与过滤器之间的区别

    过滤器,是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法u ...

  3. 【LOJ】#2239. 「CQOI2014」危桥

    LOJ#2239. 「CQOI2014」危桥 就是先把每条边正着连一条容量为2的边,反着连一条容量为2的边 显然如果只有一个人走的话,答案就是一个源点往起点连一条容量为次数×2的边,终点往汇点连一个次 ...

  4. 关于typescript中的枚举你需要知道这些

    数字枚举 数字枚举,即枚举里所有属性的值都是数字类型,先看这段代码: enum Colors { Red, Blue, Yellow } console.log(Colors.Red) console ...

  5. (一)Spring概念

    目录 Spring是开源的轻量级框架 Spring核心 Spring是一站式的框架 Spring版本 Spring是开源的轻量级框架 开源是什么,不用多说: 轻量级:Spring框架的使用,不需要依赖 ...

  6. 【Python基础】05_Python中的while循环

    1.程序的三大流程介绍 顺序 —— 从上到下,顺序执行 分支 —— 根据条件判断,决定代码的分支 循环 —— 让特定代码执行 2.while 基本语法 while 条件(判断 计数器 是否达到 目标次 ...

  7. java学习要想精炼掌握应运的必备知识(博文来源于网络)

    一: 编程基础 不管是C还是C++,不管是Java还是PHP,想成为一名合格的程序员,基本的数据结构和算法基础还是要有的.下面几篇文章从思想到实现,为你梳理出常用的数据结构和经典算法. 1-1 常用数 ...

  8. poj 1006中国剩余定理模板

    中国剩余定理(CRT)的表述如下 设正整数两两互素,则同余方程组 有整数解.并且在模下的解是唯一的,解为 其中,而为模的逆元. 模板: int crt(int a[],int m[],int n) { ...

  9. java lesson10homework

    1.    输入三个整数x, y, z,请把这三个数由小到大输出. 2.  package Homework10; 3.  //:类方法 4.  public class Sort { 5.  voi ...

  10. mysql replace substring 字符串截取处理

    SELECT a1,a2,replace(a2, "豫ICP备16006180号-", "") a22,a3,a4,a5 FROM `aaab` order b ...