问题描述:

.......

.##....

.##....

....##.

..####.

...###.

.......

有一张还以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的更多相关文章

  1. 简述BFS与DFS

    简述BFS与DFS 最近学习了数据结构课程以及应对蓝桥杯备考,所以花费了一点时间将比较重要的两个搜索BFS(宽度优先搜索)和DFS(深度优先搜索)大致思路以及代码整理出来,如有错误,还请各位大佬批评改 ...

  2. HDU-4607 Park Visit bfs | DP | dfs

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 首先考虑找一条最长链长度k,如果m<=k+1,那么答案就是m.如果m>k+1,那么最 ...

  3. BFS和DFS详解

    BFS和DFS详解以及java实现 前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问 ...

  4. 算法录 之 BFS和DFS

    说一下BFS和DFS,这是个比较重要的概念,是很多很多算法的基础. 不过在说这个之前需要先说一下图和树,当然这里的图不是自拍的图片了,树也不是能结苹果的树了.这里要说的是图论和数学里面的概念. 以上概 ...

  5. 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 ...

  6. 算法学习之BFS、DFS入门

    算法学习之BFS.DFS入门 0x1 问题描述 迷宫的最短路径 给定一个大小为N*M的迷宫.迷宫由通道和墙壁组成,每一步可以向相邻的上下左右四格的通道移动.请求出从起点到终点所需的最小步数.如果不能到 ...

  7. 【数据结构与算法】自己动手实现图的BFS和DFS(附完整源码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/19617187 图的存储结构 本文的重点在于图的深度优先搜索(DFS)和广度优先搜索(BFS ...

  8. ACM__搜素之BFS与DFS

    BFS(Breadth_First_Search) DFS(Depth_First_Search) 拿图来说 BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4, ...

  9. BFS和DFS算法

    昨晚刚昨晚华为笔试题,用到了BFS和DFS,可惜自己学艺不精,忘记了实现原理,现在借用大佬写的内容给自己做个提高 转自:https://www.jianshu.com/p/70952b51f0c8 图 ...

  10. 通俗理解BFS和DFS,附基本模板

    1.BFS(宽度优先搜索):使用队列来保存未被检测的节点,按照宽度优先的顺序被访问和进出队列 打个比方:(1)类似于树的按层次遍历 (2)你的眼镜掉在了地上,你趴在地上,你总是先摸离你最近的地方,如果 ...

随机推荐

  1. 数据分析应该掌握的知识及SQL技能

    一.概念及常识 1.数据分析必备的统计学知识 描述统计学 1.平均值.中位数.众数 2.方差.标准差 3.统计分布:正态分布.指数分布.二项分布.卡方分布 推论统计学 1.假设检验 2.置信区间 3. ...

  2. Python 基于win32com客户端实现Excel操作

    测试环境 Python 3.6.2 代码实现 非多线程场景下使用 新建并保存EXCEL import win32com.client from win32api import RGB def save ...

  3. php 后台执行进程

    一些业务需要长期在后台执行进程 下面用thinkphp5.1做演示 在command文件夹下建立进程 cd 到 lunar_php项目根目录 执行 php think hello 如果想后台执行 no ...

  4. 初学者使用1Panel面板快速搭建WordPress网站

    之前介绍了宝塔面板以及如何搭建wordpress网站,这篇文章我们来学习如何使用1Panel面板搭建wordpress网站. 一.1Panel面板介绍 1. 介绍 1Panel 是一个现代化.开源的基 ...

  5. 【Java】Socket Programming 网络编程

    Java提供了网路相关的类库,无痛连网,底层细节交给JVM控制 Java实现了一个跨平台的网络库,我们开发面对的是一个统一的网路编程环境 目的: 直接或者间接的通过网络协议和其他计算机数据交互,通讯 ...

  6. 【JDBC】自定义事务注解实现

    参考自: https://blog.csdn.net/qq_28986619/article/details/94451889 数据源选型,我采用的是C3P0,下面是需要的依赖: <?xml v ...

  7. 【Git】03 撤销 & 版本回退

    回退分为三种情况,每种情况对应了我们文件的存储区域 工作区 | 暂存区 | 版本区(当前分支) 1.文件可能存放在工作区,没有被Git追踪[红色标记状态] 2.文件可能已经添加到暂存区,没有被Git提 ...

  8. 【SpringBoot】整合Swagger 接口文档

    前言 可能运用的开发模式: SSM -> SpringMVC + Spring + Mybatis SSMP -> SpringMVC + Spring + MybatisPlus SM ...

  9. Ubuntu18.04系统下网络文件系统nfs的安装及简单配置

    硬件环境: 两台Ubuntu18.04服务器使用局域网连接,IP分别为192.168.11.66 和 192.168.11.206. ================================= ...

  10. git clone 如何通过proxy进行远程代码仓库拷贝下载

    git使用proxy的方式和ssh的情况是差不多的,给出借鉴: SSH如何通过proxy进行服务器连接 ------------------------------------------------ ...