引爆炸弹——DFS&&联通块
题目
在一个$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&&联通块的更多相关文章
- Educational Codeforces Round 5 - C. The Labyrinth (dfs联通块操作)
题目链接:http://codeforces.com/contest/616/problem/C 题意就是 给你一个n行m列的图,让你求’*‘这个元素上下左右相连的连续的’.‘有多少(本身也算一个), ...
- 蓝桥杯模拟赛-引爆炸弹-DFS+并查集
今天整理电脑,翻出来了很久以前大佬给的题,贴一下. 引爆炸弹 1000ms 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸 ...
- Codeforces277A 【dfs联通块】
题意: 给出n个人会的语言类型,然后问这n个人里面还需要几个人学习一下语言就可以n个直接互通了.a会1,2,b会2,3,c会4,那么只要C学一下1或者2,或者3就好了...大致就是这个意思. 思路: ...
- hdoj2952【DFS联通块】
我觉得还是这种不带回溯的直接搜到底的好玩啊!!!但是要注意边界,记得以前四周要空出来的一道题目,被坑了很久,还是wa到比赛结束!!!这道还是基础题 类似的基础题:POJ1562 hdoj1016 po ...
- 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 ...
- HDU - 1213 dfs求联通块or并查集
思路:给定一个无向图,判断有几个联通块. AC代码 #include <cstdio> #include <cmath> #include <algorithm> ...
- 【紫书】Oil Deposits UVA - 572 dfs求联通块
题意:给你一个地图,求联通块的数量. 题解: for(所有还未标记的‘@’点) 边dfs边在vis数组标记id,直到不能继续dfs. 输出id及可: ac代码: #define _CRT_SECURE ...
- 分别利用并查集,DFS和BFS方法求联通块的数量
联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m ...
- 蓝桥杯模拟赛 引爆炸弹-并查集+DFS
引爆炸弹 在一个 n×m的方格地图上,某些方格上放置着炸弹.手动引爆一个炸弹以后,炸弹会把炸弹所在的行和列上的所有炸弹引爆,被引爆的炸弹又能引爆其他炸弹,这样连锁下去. 现在为了引爆地图上的所有炸弹, ...
随机推荐
- Centos6.5下安装jumpserver-1.4.1报错AttributeError: module 'gssapi' has no attribute 'GSSException'
报错: >>> import paramiko Traceback (most recent call last): File "<stdin>", ...
- java中讲讲DataInputStream的用法,举例?
[学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...
- flink两种安装方式
Flink Standalone 集群 HA 配置 1. HA 集群环境规划 使用三台节点实现两主两从集群(由于笔记本性能限制,不能开启太多虚拟机,其实使用三 台和四台机器在安装配置上没有本质区别) ...
- 【AtCoder】AGC003
AGC编号越小越水???? AGC003 A - Wanna go back home 相对方向要么一起有要么一起没有 #include <bits/stdc++.h> #define f ...
- dp 状态压缩
之前我们在讨论的dp形式当中, 大多数是对整数的动态规划, 然而对于集合而言呢 ? 我们使用 DFS 吗, 看起来也可以, 但是加上dp记忆 数组的 动态规划效率更高: 那么进一步讨论, 我们如何表示 ...
- 剑指offer17:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
1 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 2 思路和方法 (1)先在A中找和B的根节点相同的结点 (2)找到之后遍历对应位置的其他结点, ...
- 关于centOS安装配置xampp那点事
1.到官网下载centOS对应版本的xampp,应该是以tar.gz为后缀的 2.tar -zxf 下载的包 3.mv lampp /opt 4.service mysqld stop因xampp里自 ...
- RPA自定义脚本打开文件夹
import os import subprocess from rpa.web.common.utils import convert_2_unicode def startfile(filenam ...
- ajaxFileUpload 被坑记
用ajaxFileUpload时,MVC的Controller层,不能用JSON去返回数据,因为前台会接不到 返回信息不能用json(),而是要转换一下. return Content(Jso ...
- Oracle 以及 PLSQL安装
今天重装系统遇到oracle 安装的问题咯 ,oracle安装过程中很多疑难杂症咯 1如果之前装过,记得去删除注册表的Oracle 相关的文件 ,请百度有很多教程咯 2这个必须要勾选的!因为的是11g ...