【代码超详解】UVA 572 Oil Deposits 油田

UVA572 油田 Oil Deposits 原题:https://www.luogu.com.cn/problem/UVA572 输入多个m行n列的矩阵,用0,0表示输入结束。找出有多少块石油区域,用“@”代表石油,假如两个“@”在横,竖或对角线上相邻,就说它们位于同一区域,对于每个输入,输出一个数表示有几个石油区域。 典型的深度优先搜索的题,主函数之内调用dfs(x,y). 下面主要说dfs函数 每次搜索比它更大的一圈即可. #include<iostream> #include<cstdio> #inclu 阅读详情

一、题目描述

GeoSurvComp 公司负责勘探地下的石油存在情况。公司在作业时总是把矩形区域分成一个个方格,然后独立分析各个方格,探测地下是否存在石油。
输入多个测试样例。每个样例的第一行是两个整数 m 和 n 代表区域被分成 m 行 n 列(0 < m, n <= 100)的小方格。接下来 m 行输入 n 个字符,表示每一格的勘探结果, 星号表示没有石油,@ 表示存在石油。
如果 @ 能跟周围八个方块直接连在一起,就将这些 @ 标记的含有石油的区域视为一片油田。对每个测试用例,输出油田数量。

二、算法分析说明与代码编写指导

基本思路:
依次查找每一格,如果标记为 @ 就查找周围 8 个格。周围 8 个格中的任意一个格仍然有 @ 就继续查找该格周围的 8 个格。
可以看出,将查找周围 8 个格的过程写成函数并递归调用比较合适。
除了要用专门的二维数组 grid[101][101] 标记存在石油的情况以外,还需要一个相同大小的二维数组 id[101][101] 来记录每个连通区域的 ID 。这是因为如果只标记是否存在石油,那么当查找到某个 @ 并查找与其连通的 @ 的时候,并不能得知这些 @ 连通的是已经查找过的整片油田还是新的油田,所以需要对已找到的部分分配唯一的标识符方便计数。
搜索过程中,因为是调用递归函数搜索的,所以一定要增加额外的限制条件,避免无限递归。为了防止陷入死循环并减少搜索次数,需要添加判断。仅该方格是 @ 符号时才进行搜索并标记 ID 。对其周围 8 个方格同理。而且如果已经标记了 ID(从 1 开始,未被标记过的存在石油的小块的 ID 都记为零),该格就不再搜索。这样不但可以减少搜索次数,对查找过程中遇到的已经确定是油田的区域(即已有不为零的 ID 的区域)不用再一格一格去判断,还可以避免如下情形的死循环:查找到某个 @ ,在查找周围 8 个格的时候如果也查找到 1 个 @ ,那么这个 @ 的周围 8 个格中肯定又包含原来的 @ ,于是在查找新的 @ 的周围 8 格的过程中又会找到这个原来的 @ 并继续查找,如此往复。
另外,为了避免越界,还需要在查找的边界所在的行数或列数小于零,或者行数大于等于 m(从第 0 行开始对网格编号),或者列数大于等于 n 的时候直接停止继续深入搜索。
这里面有个小技巧,在主程序里初次调用搜索函数 SearchSur 时,传入的第三个参数就是当前的 ID,在传入前就从 0 开始增加,增加以后再传入,每次在 main() 里调用时这个参数都增加 1 。这个 ID 即为已探明的油田的编号(从 1 开始)。而在函数内再调用时,传入的 ID 就保持最开始的递归调用时传入的 ID 而不增加,这就让一个连通区域的所有 @ 对应的位置都被标记为同一个 ID 。
在输入新的样例前,都要清空已有的记录。

三、AC 代码(0 ms)

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#pragma warning(disable:4996)
char m, n; unsigned char grid[101][101];<
UE4_SpeedTree Shader源码分析 目录 1.UMaterialExpressionSpeedTree::Compile 2.Compiler->SpeedTree 3.GetSpeedTreeVertexOffset 4.Scene中的SpeedTree应用 (Scene->UpdateSpeedTreeWind) 5.GetSpeedTreeVertexOffsetInner 由于之后做风场,也需要在S... 阅读详情

相关推荐

神经元细胞结构刨析(持续更新)

神经细胞的学习笔记

weixin_46596227的博客 2221

【邻接表存图模板】vector邻接表、数组邻接表、链式前向星

一、目录 一、目录 二、前言 三、邻接表“详解” (一)边的信息 (二)几种邻接表的实现方法“详解” 1.数组邻接表 代码 2.vector邻接表 代码 vector邻接表还有一种魔性写法: 3.链式前向星 代码 四、总结 二、前言 本来之前自己太弱了,一直只会用邻接矩阵,后来发现邻接表才是主流... 参考&特别鸣谢: https://www.cnblog...

十里寒塘路♣烟花一半醒 3113

告别环境依赖!用PyInstaller把PaddleOCR项目打包成独立EXE(附完整spec文件配置)

本文详细介绍了如何使用PyInstaller将PaddleOCR项目打包成独立EXE文件,彻底解决Python环境依赖问题。通过完整的spec文件配置和实战技巧,开发者可以轻松创建开箱即用的OCR工具,特别适合需要交付给非技术用户的场景。文章涵盖环境配置、模型打包、性能优化等关键环节,并提供了解决常见问题的方案。

weixin_33712987的博客 574

Unreal浅做一个MetaBall

Raymaching其实就是实时场景的一种渲染方法。主要原理网上有很多详细介绍。简单来说就是,以摄像机为原点,发射很多条射线,而每一条射线以步长为单位向前采样,同时以采样点和最近的物体像素的距离为半径进行一个球形检测。检测到摄像机和场景像素在当前射线方向的距离差小于某个值,就表示射线到达物体表面,然后画这个像素。

xzljj的博客 335

HC32F460 FPU实战:从零开启硬件浮点加速

本文详细介绍了如何在HC32F460开发板上启用和优化FPU(浮点运算单元),以显著提升硬件浮点运算性能。从工程配置、关键代码修改到实战优化技巧,全面解析FPU加速的实现方法,并分享常见问题的解决方案,帮助开发者避免常见陷阱,充分发挥HC32F460的硬件潜力。

weixin_42620340的博客 349

基于ENVI5.6与SARscape的哨兵一号时序InSAR实战:从数据准备到PS/SBAS结果解译

本文详细介绍了基于ENVI5.6与SARscape软件,利用哨兵一号(Sentinel-1)卫星数据,进行PS-InSAR与SBAS-InSAR时序分析,以监测地表形变的完整实战流程。内容涵盖从数据下载、软件配置、预处理、核心处理步骤到结果解译与质量评估,重点解析了PS与SBAS方法的关键参数设置、常见问题及解决方案,旨在帮助用户掌握从数据准备到成果分析的完整技术链条。

oo7890的博客 634

(头歌作业)—6.1 葡萄酒评论分析报告(project)

请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。

2301_80677920的博客 1245

数字人(对嘴型 Lip-sync)数据集 LRS2 介绍(含网盘链接)

LRS2(Lip Reading Sentences 2)是牛津大学与BBC合作开发的一个大规模唇语识别数据集,专门用于训练和评估数字人唇语同步(Lip-sync)技术。该数据集包含数千条来自BBC电视节目的口语句子,每个句子长度最多100个字符。官方网站为:https://www.robots.ox.ac.uk/~vgg/data/lip_reading/lrs2.html可惜需要认证,不过我已经下载好并存到网盘里了,有需要可适用如下链接下载。(仅供学习,请勿传播)

iioSnail的博客 1687

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

上一篇: 【代码超详解】UVA 297 Quadtrees 四分树
下一篇: 【补充说明Ver.】Catalan数(卡特兰数)及相关问题举例
山上一缕烟
博客等级 码龄8年 269粉丝 498原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值