蓝桥杯:全球变暖(python,BFS,DFS)(栈溢出的处理办法)
图论的经典题型,深度优先搜索和广度优先搜索都可以,但是本题推荐使用广度优先搜索(类似的题最好都用广度优先搜索),因为使用深度优先搜索会爆栈(栈溢出)。本篇博客两种方法都进行讲解,也会讲解栈溢出的解决方案。
题目:
题目链接:全球变暖
你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。
具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
输入格式
第一行包含一个整数N。
以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N×N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋。照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
输出格式
一个整数表示答案。
数据范围
1≤N≤1000
输入样例1:
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出样例1:
1
输入样例2:
9
.........
.##.##...
.#####...
.##.##...
.........
.##.#....
.#.###...
.#..#....
.........
输出样例2:
1
思路:
接触过图论的同学都知道 连通块问题,是基础搜索。用DFS或BFS都行:遍历一个连通块(找到这个连通块中所有的’#‘,并标记已经搜过,不用再搜);再遍历下一个连通块…;遍历完所有连通块,统计有多少个连通块。
本题是在寻找连通块的基础上进行了进阶(问题1),还要找寻被淹没的连通块(问题2)。(这里分步讨论)
问题1很好解决,那么问题2该如何计数呢?
方法一:BFS:
在统计连通块的基础上我们可以定义两个变量 total 和 bound
total 用来统计每个连通块上有多少块土地,
bound 用来统计在每个连通块上有多少土地是紧挨着水的(上,下,左,右任意一边挨水都算),
如果 total = bound 则表明该连通块会完全淹没(因为所有土地都紧靠水)。
这个思路想出来了问题就很好解决了,下面直接套用模板就行
代码及详细注释:
from collections import deque# 输入迷宫大小
n = int(input())
a = []
# 读取迷宫
for i in range(n):path = list(input())a.append(path)# 记录访问情况
vis = [[False] * n for _ in range(n)]
# 定义四个方向
dirs = [[0,1],[0,-1],[1,0],[-1,0]]def bfs(x, y):global total, boundq = deque()vis[x][y] = Trueq.append([x, y])while q:curx, cury = q.popleft()total += 1is_bound = Falsefor dir in dirs:next_x = curx + dir[0]next_y = cury + dir[1]# 边界检查if next_x < 0 or next_y < 0 or next_x >= n or next_y >= n:continue# 已访问过的点跳过if vis[next_x][next_y] == True:continue# 如果是水域,标记为边界点并跳过if a[next_x][next_y] == '.':is_bound = Truecontinuevis[next_x][next_y] = Trueq.append([next_x, next_y])if is_bound:bound += 1cnt = 0
# 遍历整个迷宫
for i in range(n):for j in range(n):# 未访问过的岛屿开始进行搜索if vis[i][j] == False and a[i][j] == '#':total = 0bound = 0bfs(i, j)# 如果所有土地都紧靠水,计数加一if total == bound:cnt += 1print(cnt)
方法二:DFS
dfs解决问题二的时候有个很巧妙的方法,就是在统计连通块的时候多加一个判断语句(判断当前岛屿是否被完全淹没),就是判断上下左右是否为陆地,如果是陆地的话,最后计数不算该连通块。
但是dfs很大的问题就是栈溢出问题,也就是爆栈,虽然 dfs 比 bfs 写起来简单但不太推荐大家在打比赛的时候用(爆栈几率小但也不敢赌啊)
解决爆栈问题也比较简单,对递归深度进行限制即可,使用sys.setrecursionlimit()函数
在Python中,sys.setrecursionlimit()函数用于设置递归深度限制。递归深度指的是递归函数嵌套调用的层数。通过调用sys.setrecursionlimit()函数,可以设置Python解释器允许的最大递归深度,从而避免递归调用导致的栈溢出错误。
代码及详细注释:
import sys
# 设置递归深度限制
sys.setrecursionlimit(60000)# 读取输入的迷宫大小
n = int(input())# 读取迷宫地图
a = []
for i in range(n):path = list(input())a.append(path)# 记录访问状态
vis = [[False] * n for _ in range(n)]# 定义四个方向
dirs = [[0, 1], [0, -1], [1, 0], [-1, 0]]# 深度优先搜索函数
def dfs(x, y):global flagvis[x][y] = True# 判断当前岛屿是否被完全淹没if a[x][y + 1] == "#" and a[x][y - 1] == "#" and a[x + 1][y] == "#" and a[x - 1][y] == "#":flag = 1# 遍历四个方向for dir in dirs:next_x = x + dir[0]next_y = y + dir[1]if next_x < 0 or next_y < 0 or next_x >= n or next_y >= n:continueif vis[next_x][next_y] == True:continueif a[next_x][next_y] == '.':continuedfs(next_x, next_y)# 统计未被淹没的岛屿数量
cnt = 0
for i in range(n):for j in range(n):if vis[i][j] == False and a[i][j] == '#':flag = 0dfs(i, j)if flag == 0:cnt += 1
# 输出结果
print(cnt)
总结:
本题看着很简单,但是统计问题解决实现起来还是有点绕的。
相关文章:
蓝桥杯:全球变暖(python,BFS,DFS)(栈溢出的处理办法)
图论的经典题型,深度优先搜索和广度优先搜索都可以,但是本题推荐使用广度优先搜索(类似的题最好都用广度优先搜索),因为使用深度优先搜索会爆栈(栈溢出)。本篇博客两种方法都进行讲解࿰…...
Qt C++ | Qt 元对象系统、信号和槽及事件(第一集)
01 元对象系统 一、元对象系统基本概念 1、Qt 的元对象系统提供的功能有:对象间通信的信号和槽机制、运行时类型信息和动态属性系统等。 2、元对象系统是 Qt 对原有的 C++进行的一些扩展,主要是为实现信号和槽机制而引入的, 信号和槽机制是 Qt 的核心特征。 3、要使用元…...
Python 抽象类
在Python的抽象基类(ABC)中,方法并不是必须全部是抽象方法。抽象基类可以同时包含抽象方法和具体方法。抽象类中可以有抽象方法也可以定义具体方法 具体来说: 抽象方法: 使用abc.abstractmethod装饰器标记的方法是抽象方法。抽象方法没有方法体,只有方法签名。抽象方法必须在具…...
达梦数据库自动备份(全库)+还原(全库) 控制台
一 前提 1.安装达梦数据库DB8(请参照以前文章) 我的数据库安装目录是 /app/dmDB8 2.已创建实例 (请参照上一篇文章) 二 准备测试数据 三 自动备份步骤 1.开启归档模式 开启DM管理工具管理控制台 弹不出来工具的 输入命令 xhost 第一步 将服务器转换为配置状态 右键-&g…...
android AndroidAutoSize 取消第三方库适配问题(两个步骤)
比如第三方库的Activity是:PictureSelectorSupporterActivity、PictureSelectorTransparentActivity、CropImageActivity 1.在自定义Application 的 onCreate 方法设置: Overridepublic void onCreate() {super.onCreate();this.mAppthis;registerActi…...
【Java 多线程】从源码出发,剖析Threadlocal的数据结构
文章目录 exampleset(T value)createMap(t, value);set(ThreadLocal<?> key, Object value)ThreadLocalMap和Thread的关系 全貌 ThreadLocal是个很重要的多线程类,里面数据结构的设计很有意思,很巧妙。但是我们平时使用它的时候常常容易对它的使用…...
Sy6 编辑器vi的应用(+shell脚本3例子)
实验环境: 宿主机为win11,网络:10.255.50.5 6389 WSL2 ubuntu 目标机的OS:Ubuntu 内核、版本如下: linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…...
把标注数据导入到知识图谱
文章目录 简介数据导入Doccano标注数据,导入到Neo4j寻求帮助 简介 团队成员使用 Doccano 标注了一些数据,包括 命名实体识别、关系和文本分类 的标注的数据; 工作步骤如下: 首先将标注数据导入到Doccano,查看一下标注…...
【前端基础】什么是类数组对象,类数组对象转换成数组的方法
类数组对象(array-like object)是指在 JavaScript 中具有类似数组的特征但不是真正的数组的对象。这些对象具有类似数组的特性,例如有一个 length 属性和通过索引访问元素的能力,但它们不具备数组对象的所有方法和特性。 什么是类…...
Python快速入门系列-8(Python数据分析与可视化)
第八章:Python数据分析与可视化 8.1 数据处理与清洗8.1.1 数据加载与查看8.1.2 数据清洗与处理8.1.3 数据转换与整理8.2 数据可视化工具介绍8.2.1 Matplotlib8.2.2 Seaborn8.2.3 Plotly8.3 数据挖掘与机器学习简介8.3.1 Scikit-learn8.3.2 TensorFlow总结在本章中,我们将探讨…...
双非硕转测试之Java学习笔记(一):集合
Java学习-----集合 简单概括单列集合--collectionlist接口:vector类:LinkedList类:set接口:HasSet类:LinkedHashSet类: 双列集合--MapMap接口:HashMap类:HashTable类:Pro…...
zabbix源码安装
目录 一.安装php和nginx客户端环境 二.修改php配置 三.修改nginx配置文件 四.下载并编译zabbix 五.创建zabbix需要的用户及组 六.安装编译需要的依赖 七.配置zabbix文件 八.数据库配置 九.配置zabbix 十.web界面部署 十一.遇到无法创建配置文件 十二.登录zabbix 前…...
计算机视觉之三维重建(5)---双目立体视觉
文章目录 一、平行视图1.1 示意图1.2 平行视图的基础矩阵1.3 平行视图的极几何1.4 平行视图的三角测量 二、图像校正三、对应点问题3.1 相关匹配法3.2 归一化相关匹配法3.3 窗口问题3.4 相关法存在的问题3.5 约束问题 一、平行视图 1.1 示意图 如下图即是一个平行视图。特点&a…...
计算机网络-TCP/IP 网络模型
TCP/IP网络模型各层的详细描述: 应用层:应用层为应用程序提供数据传输的服务,负责各种不同应用之间的协议。主要协议包括: HTTP:超文本传输协议,用于从web服务器传输超文本到本地浏览器的传送协议。FTP&…...
算法训练营第29天|LeetCode 491.递增子序列 46.全排列 47.全排列Ⅱ
LeetCode 491.递增子序列 题目链接: LeetCode 491.递增子序列 解题思路: 用哈希集合进行去重,同一树层不能取重复元素。 代码: class Solution { public:vector<vector<int>>result;vector<int>path;void…...
Ubuntu服务器搭建 - 环境篇
Ubuntu服务器搭建 - 环境篇 基于腾讯云服务器 - Ubuntu 20.04 LTS 一、安装 - MySQL 1.1 概述 MySQL安装方式有三种: 1. 使用Ubuntu 包管理工具 apt安装 2. 使用MySQL官方APT存储库安装 3. 使用MySQL官方二进制发行版安装 1.2 安装 MySQL 使用MySQL官方APT存储库安装 $ wget…...
深度学习基础模型之Mamba
Mamba模型简介 问题:许多亚二次时间架构(运行时间复杂度低于O(n^2),但高于O(n)的情况)(例如线性注意力、门控卷积和循环模型以及结构化状态空间模型(SSM))已被开发出来,以解决 Transformer 在长…...
Topaz Video AI for Mac v5.0.0激活版 视频画质增强软件
Topaz Video AI for Mac是一款功能强大的视频处理软件,专为Mac用户设计,旨在通过人工智能技术为视频编辑和增强提供卓越的功能。这款软件利用先进的算法和深度学习技术,能够自动识别和分析视频中的各个元素,并进行智能修复和增强&…...
解决WordPress文章的段落首行自动空两格的问题
写文章时,段落首行都会空两格,可是WordPress自带的编辑器却没有考虑到这一点,导致发布的文章首行都是顶格的,看起来很不习惯。 我们通常的解决方法都是在发布文章时把编辑器切换到“文本”模式,然后再在首行手动键入两…...
RISC-V单板计算机模拟和FPGA板多核IP实现
🎯要点 🎯使用单板计算机 Visionfive 2 或模拟器测试RISC-V汇编🎯RISC-V汇编加载和算术。🎯使用GNU MAKE汇编RISC-V指令,ESP32使用CMake编译执行指令。🎯RISC-V汇编功能和使用释义:控制指令&am…...
应对海外AIGC检测:初稿AI率飙到97%怎么救?4个结构级优化实测指南
大家最近都在为英文降aigc率发愁吧,作为研三党,我太懂这种痛了,之前我自己写英文初稿,写完直接拿去查重,结果turnitin检测ai率飙到了89%,当时看着报告整个人都懵了。 怎么给英文降ai?对于非母语…...
2026年,性价比超高的直播代运营供应商究竟哪家强?
在直播电商行业持续火爆的当下,众多品牌都希望借助直播代运营服务来提升销售业绩和品牌影响力。然而,市场上直播代运营供应商众多,质量参差不齐,如何选择一家性价比超高的供应商成为了品牌方的一大难题。今天,就为大家…...
【2026年携程暑期实习- 5月10日-第四题-单数组交换】(题目+思路+JavaC++Python解析+在线测试)
题目内容 游游有两个长度同为 nnn 的整数数组 aaa 和 bbb。她会对数组...
从K-means到注意力机制:拆解DHGNN论文里的动态构图与卷积模块(附代码解读)
从K-means到注意力机制:拆解DHGNN论文里的动态构图与卷积模块(附代码解读) 在深度学习领域,图神经网络(GNN)已经成为处理非欧几里得数据的利器。然而,传统GNN面临一个根本性限制——它们依赖于预定义的静态图结构&…...
终极django-htmx性能优化指南:如何减少网络请求并提升用户体验 [特殊字符]
终极django-htmx性能优化指南:如何减少网络请求并提升用户体验 🚀 【免费下载链接】django-htmx Extensions for using Django with htmx. 项目地址: https://gitcode.com/gh_mirrors/dj/django-htmx django-htmx是连接Django框架与现代前端交互库…...
AI智能体技能管理:MCP服务器安装配置与实战指南
1. 项目概述:一个为AI智能体管理“技能”的MCP服务器 最近在折腾AI智能体(Agent)开发的朋友,应该都遇到过同一个痛点:想让你的Claude、GPT或者Gemini去执行一些特定的、复杂的任务,比如调用某个API、处理特…...
基于Raspberry Pi Pico的DIY宏键盘:从矩阵扫描到KMK固件实战
1. 项目概述:ClawDeck,一个为游戏玩家打造的桌面控制中心最近在逛一些开发者社区和硬件DIY论坛时,发现一个叫“ClawDeck”的项目挺有意思。项目作者是“gaminghousenursingaide761”,这个名字看起来像是一个个人开发者的ID。ClawD…...
AI助手自我进化框架:异步复盘与技能固化工程实践
1. 项目概述:一个让AI助手学会自我进化的“内功心法”如果你用过Claude、ChatGPT或者国内的一些大模型,肯定有过这样的体验:你跟它聊得挺好,让它帮你写个代码、分析个文档,它都能干。但聊着聊着,你发现它好…...
工程师必读:六大情感触发器,破解技术产品市场转化难题
1. 项目概述:当工程师遇上商业,一场关于“情感”的必修课最近有个工程师朋友跟我抱怨,说他团队花了两年心血打磨的产品,技术指标全面领先,结果推向市场后反响平平,远不如隔壁一个技术平平但“会讲故事”的竞…...
轻量级视频稳定技术:EfficientMotionPro与OnlineSmoother解析
1. 轻量级视频稳定技术概述视频稳定技术是现代计算机视觉领域的重要研究方向,其核心目标是消除因相机抖动导致的画面不稳定现象。传统视频稳定方法通常依赖于复杂的光流计算或3D场景重建,这些方法虽然效果稳定,但计算开销巨大,难以…...
