bfs与dfs ,全球变暖——蓝桥problems178
问题描述:
.......
.##....
.##....
....##.
..####.
...###.
.......
有一张还以N*N的像素照片,“.”表示海洋,“#”表示陆地,其中上下左右能连在一起的陆地称作岛屿,例如上图有两座岛屿,由于全球气候变暖,靠经海洋的陆地会被淹没,问图中有多少座岛屿会被完全淹没
.......
.......
.......
.......
....#..
.......
.......
输入:
第一行输入一个整数N,之后的N*N输入该像素照片,保证第一行第一列最后一行最后一列都为海洋。
输出:
输出一个整数表示答案
问题分析:
要找到所有的岛屿,如果该岛屿存在高地则该岛屿不会被淹没,即存在一片陆地其周围都是陆地的岛屿,可以使用DFS,BFS进行搜索,由于每个像素点都需要搜索,一共有N*N个点那么时间复杂度为O(N**2),好像不可能再优了
DFS代码:
#include<iostream>
using namespace std;
const int N = 1010;
char mp[N][N];
int vis[N][N] = { 0 };
int d[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int flag;
void dfs(int x, int y) {
vis[x][y] = 1; //标记为该节点已经查过,与下面的dfs(nx, ny);搭配
//条件
if (mp[x][y - 1] == '#' && mp[x][y + 1] == '#' && mp[x - 1][y] == '#' && mp[x + 1][y] == '#') {
flag = 1; //flag=1代表有高地,该岛屿不会被淹没
}
//搜索四个周围方向
for (int i = 0; i < 4; i++) {
int nx = x + d[i][1]; int ny = y + d[i][2];
if (vis[nx][ny] == '0' && mp[nx][ny] == '# ') { //注意这个判断语句两个条件的先后,这里其实是在岛屿内搜索了,需要把所有的陆地都标记
dfs(nx, ny);
}
}
}
int main() {
int n; cin >> n;
for (int i = 0; i < n; i++) {
cin >> mp[i];
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (mp[i][j] == '#' && vis[i][j] == 0) { //这个是整图搜索,所以是这样的条件先后
flag = 0;
dfs(i, j);
if (flag == 0) {
ans++;
}
}
}
}
cout << ans << endl;
return 0;
}
bfs代码:
#include<iostream>
#include <queue>
using namespace std;
const int N = 1010;
char mp[N][N];
int vis[N][N];
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
int flag;
void bfs(int x, int y) {
queue < pair<int, int>>q;
q.push({ x, y });
vis[x][y] = 1;
//dfs可以利用递归实现查询,而bfs需要利用循环
while (q.size()) {
pair<int, int>t = q.front();
q.pop(); //需要将队首删除
int tx = t.first; int ty = t.second;
if (mp[tx][ty - 1] == '#' && mp[tx][ty - 1] == '#' && mp[tx - 1][ty] == '#' && mp[tx + 1][ty] == '#') {
flag = 1;
}
for (int i = 0; i < 4; i++) {
//上下左右四个方向依次进队
int nx = tx + dir[i][1]; int ny = ty + dir[i][2];
if (vis[nx][ny] == 0 && mp[nx][ny] == '#') {
vis[nx][ny] == 1; //这里和dfs不同,记得标记
q.push({ nx,ny });
}
}
}
}
int main() {
int n; cin >> n;
for (int i = 0; i < n; i++) {
cin >> mp[n];
}
int ans = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (mp[i][j] == '#' && vis[i][j] == 0) {
flag = 0;
bfs(i, j);
if (flag == 0) {
ans++;
}
}
}
}
cout << ans << endl;
return 0;
}
由此可见,dfs实际上就是递归,而bfs就是循环,相比之下好像bfs更好理解,哈哈
bfs与dfs ,全球变暖——蓝桥problems178的更多相关文章
- 简述BFS与DFS
简述BFS与DFS 最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改 ...
- HDU-4607 Park Visit bfs | DP | dfs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...
- BFS和DFS详解
BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...
- 算法录 之 BFS和DFS
说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...
- hdu--1026--Ignatius and the Princess I(bfs搜索+dfs(打印路径))
Ignatius and the Princess I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (J ...
- 算法学习之BFS、DFS入门
算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...
- 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)
转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...
- ACM__搜素之BFS与DFS
BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...
- BFS和DFS算法
昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...
- 通俗理解BFS和DFS,附基本模板
1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...
随机推荐
- Web开发中【密码加密】详解
作为一名Web开发人员,我们经常需要与用户的帐号系统打交道,而这其中最大的挑战就是如何保护用户的密码.经常会看到用户账户数据库频繁被黑,所以我们必须采取一些措施来保护用户密码,以免导致不必要的数据泄露 ...
- [NOIP2008 提高组] 笨小猴(洛谷题号P1125)
[NOIP2008 提高组] 笨小猴 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描 ...
- electron安装成功记录
1.登录官网查看当前最新版本对应的node,注意这里不要看php那个汉化的,他那个是老版本的,node对不上 2.nvm安装一个新的node 3.使用cnpm安装(npm安装还是报错了,记得删node ...
- 【H5】01 入门 & 概述
前言 看了很多教程资料,很难受,东西讲不全,一些属性就是简单的解释就没了,不能追根问底的了解这个东西,所以在后面, 越是学习就越是费解,出现的问题也越来越多.什么快速学完都是不存在的,培训机构的东西也 ...
- 【DataBase】MySQL 09 SQL函数 单行函数其三 日期函数
日期函数 日期&时间函数 NOW 当前日期时间. CURDATE 当前日期. CURTIME 当前时间 -- NOW();返回系统日期+时间 SELECT NOW(); -- CURDATE( ...
- 【JDBC】Extra04 Mirosoft-Access-JDBC
MS没提供Jdbc驱动,有一个第三方的UcanAcess驱动包 <!-- https://mvnrepository.com/artifact/net.sf.ucanaccess/ucanacc ...
- 【JavaScript】前端算法题 40道题+解析
前言 最近练习了一些前端算法题,现在做个总结,以下题目都是个人写法,并不是标准答案,如有错误欢迎指出,有对某道题有新的想法的友友也可以在评论区发表想法,互相学习 题目 题目一: 二维数组中的查找: 在 ...
- 【转载】 docker挂载volume的用户权限问题,理解docker容器的uid
=================================================================== 在刚开始使用docker volume挂载数据卷的时候,经常出现 ...
- 深度解读KubeEdge架构设计与边缘AI实践探索
摘要:解读业界首个云原生边缘计算框架KubeEdge的架构设计,如何实现边云协同AI,将AI能力无缝下沉至边缘,让AI赋能边侧各行各业,构建智能.高效.自治的边缘计算新时代,共同探索智能边缘的新篇章. ...
- 社区6月月报 | Apache DolphinScheduler重要修复和优化记录
各位热爱Apache DolphinScheduler的小伙伴们,社区6月月报更新啦!这里将记录Apache DolphinScheduler社区每月的重要更新,欢迎关注. 月度Merge Stars ...