当前位置: 首页 > news >正文

深度优先算法(DFS)洛谷P1683-入门

虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章..

这些代码均是我记录自身成长的记录,有写的不好的地方请谅解!

先上代码:

#include <iostream>  
#include <vector>  
#include<iomanip>
#include<cstdio>
using namespace std;
const int N = 30;
char g[N][N];
int n,m;//n行 m列
int zhuankuai = 0;
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };//方向
bool cizhuan[N][N];//同位标记瓷砖是否能走 全局静态数组默认false
void dfs(int x, int y) {for (int i = 0; i < 4; i++) {int a = x + dx[i], b = y + dy[i];	//上右下左历遍if (a < 0 || a >= n || b < 0 || b >= m) continue;//边界不走if (g[a][b] != '.') continue;//如果它不是瓷砖 也不走if (cizhuan[a][b]) continue;//走过的瓷砖 爷不走//通过考验cizhuan[a][b] = true;//走过你了 下次不走了zhuankuai++;//走过的砖块数++dfs(a,b);//递归 继续走下去 当走到条件尽头 无路可走后就停下了}
}
int main() { scanf("%d %d", &m, &n);for (int i = 0; i < n; i++) {scanf("%s", g[i]);}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (g[i][j] == '@') {cizhuan[i][j] = true;dfs(i, j);}}}zhuankuai++;//起点也算一块砖printf("%d\n", zhuankuai);return 0;
}

开始来一步步解析做法:

1.建立数组g[N][N],为什么N=30? 因为题目中给出了范围要求,而我的N=30会比题目大一些,防止莫名其妙的问题.

2.为什么选用char类型数组,请看题目给出的样例,他就是一个个字符...

3.scanf("%s", g[i]);如何解释这一行代码? 注意,我的for循环i是从0开始到n-1的,这么做是可以直接根据样例输入数据的.

4.注意n它代表行 m它代表列 所以scanf("%d %d", &m, &n);的意思是 先输入 列 再输入 行,看到这里你应该就能理解[3]了,它是字符以行的形式录入的.

5.双For循环是为了找到起始点的坐标[i][j]

6.找到起始位置‘@’之后我们也同时找到了它的坐标,那么,建立一个DFS函数,把它的坐标先传进去,由此,我们获得了DFS最开始的起始.

7.如何解释 cizhuan[i][j]=true? 它(bool cizhuan)代表了每个砖块是否被踩过,因为洛谷题目中告诉我们重复踩砖块是不算计数的,而我把它定义在全局区就是让他默认False状态,代表没被踩过,当你传入这个坐标进入DFS(深度优先)的时候,它就被踩过了,所有标记为true.

8.双for循环结束后,为什么要zhuankuai+1? 因为起始点被踩过了,这在dfs函数内是没有记录的,所以你需要+1.

====================main部分结束===================DFS部分↓

首先我们定义了两个数组 dX 和 dY ,你需要把它们连起来看.

        比如你有1个坐标{x,y},这里请不要把它想象成数学的坐标系,计算机的数组坐标它不一样,具体的,你自己可以创建一个数组,自己拿手指指它们的坐标,如果你自己说不出来,请先回去好好学习一下二维数组.

        当你理解二维数组的坐标后,再看dx和dy,然后再结合初始的(x,y),你会发现如果同时引入dx的第一个元素 和 dy的第一个元素 那么初始的(x,y)就成为了→(x-1,y+0) , 这代表什么? 如果你把(x,y)作为一个点,那么这个坐标的意思就是在计算机的二维数组中往右边挪移了一个单位,由此我们实现了点的四向移动.

        我们拥有了四个方向移动的方法之后,我们就需要建立一个for循环来历遍这3个方向,这里我创建了int类型的a和b,它们分别代表在这一个方向上x和y被更新成了什么坐标.

        我们获得a,b这2个新的坐标,我们遇到了一个问题---这个坐标是否可用?

        所以我们首先需要判断是否越界,代码中用一个if已经囊括了,注意:请不要忘记n代表行,m代表列!!!注意数组是从0行0列开始计数的!!!

        然后我们遇到了第二个问题,这个砖是不是能走的砖?它可能是墙壁!所以我们要判断,如果它不是'.'就跳过(换个方向继续试). 这里这个‘.'在题目中的含义是可走的砖头.

        最后我们需要判断,这个可以走的砖头有没有被走过,这时候我们之前定义的bool数组就可以出来判断了,如果它是True(走过)那么这个方向仍然不能走,我们还需要转到下一个方向,反之,它可以走,那么我就走它!然后把它定义成false代表走过了,这时候对走过的砖块即(zhuankuai)就可以进行++的操作了,代表走过一块儿.

        然后因为这个坐标通过了我们的层层考验,所以我们需要把这个坐标重新传入DFS函数中,这里牵扯到一点递归的概念,当这个DFS函数结束的时候,代表已经没有砖块可以走了,至此,我们走过了最多的瓷砖,并且没有死,OK,题目通关!

        如果你不想看来回切屏看题目,没事,我已经帮你复制下来了!A.A

        

题目描述

不是任何人都可以进入桃花岛的,黄药师最讨厌像郭靖一样呆头呆脑的人。所以,他在桃花岛的唯一入口处修了一条小路,这条小路全部用正方形瓷砖铺设而成。有的瓷砖可以踩,我们认为是安全的,而有的瓷砖一踩上去就会有喷出要命的毒气,那你就死翘翘了,我们认为是不安全的。你只能从一块安全的瓷砖上走到与他相邻的四块瓷砖中的任何一个上,但它也必须是安全的才行。

由于你是黄蓉的朋友,她事先告诉你哪些砖是安全的、哪些砖是不安全的,并且她会指引你飞到第一块砖上(第一块砖可能在任意安全位置),现在她告诉你进入桃花岛的秘密就是:如果你能走过最多的瓷砖并且没有死,那么桃花岛的大门就会自动打开了,你就可以从当前位置直接飞进大门了。

注意:瓷砖可以重复走过,但不能重复计数。

输入格式

第一行两个正整数 WW 和 HH,分别表示小路的宽度和长度。

以下 HH 行为一个 H×WH×W 的字符矩阵。每一个字符代表一块瓷砖。其中,. 代表安全的砖,# 代表不安全的砖,@ 代表第一块砖。

输出格式

输出一行,只包括一个数,即你从第一块砖开始所能安全走过的最多的砖块个数(包括第一块砖)。

输入输出样例

输入 #1复制

11 9
.#.........
.#.#######.
.#.#.....#.
.#.#.###.#.
.#.#..@#.#.
.#.#####.#.
.#.......#.
.#########.
...........

输出 #1复制

59

说明/提示

数据规模与约定

对于全部的测试点,保证 1≤W,H≤201≤W,H≤20。

        

相关文章:

深度优先算法(DFS)洛谷P1683-入门

虽然洛谷是有题解的,但是你如果直接看得懂题解,你也不会来看这篇文章.. 这些代码均是我记录自身成长的记录,有写的不好的地方请谅解&#xff01; 先上代码&#xff1a; #include <iostream> #include <vector> #include<iomanip> #include<cstdio&…...

Python数据分析基础

本文介绍了Python在数据分析中的应用&#xff0c;包括数据读取、清洗、处理和分析的基本操作。通过使用Pandas和Numpy库&#xff0c;我们可以高效地处理大量数据&#xff0c;并利用Matplotlib和Seaborn库进行数据可视化。 1. 引言 Python因其简洁的语法和强大的库支持&#x…...

《企业自设2-软件测试》线下课day3: 006扩展虚拟机

1.win11 修改hosts无权限 分别再cmd终端输入以下两行代码&#xff1a; C:\Windows\System32\drivers\etcnotepad hosts 2.先保存快照&#xff01;&#xff01;&#xff01; 3.关闭虚拟机&#xff0c;将内存&#xff0c;CPU进行修改 就是再这个位置修改&#xff1a; 4.运…...

配置和排查 Lombok 在 IDEA 中使用的详细步骤

在日常开发中&#xff0c;Java 代码常常需要大量的样板代码&#xff0c;比如 getter、setter、toString 等方法。Lombok 是一个 Java 库&#xff0c;可以通过注解的方式&#xff0c;自动生成这些常见的代码&#xff0c;从而让代码更加简洁、清晰。比如&#xff0c;我们可以通过…...

JavaWeb合集18-接口管理Swager

十八、接口管理 1、Swager 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息&#xff0c;就可以做到生成接口文档&#xff0c;以及在线接口调试页面。 官网: https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案。 <dependency&g…...

背包九讲——二维费用背包问题

目录 二维费用背包问题 问题描述&#xff1a; 解决方法&#xff1a; 方法一&#xff1a; 代码实现&#xff1a; 方法二&#xff1a; 代码实现&#xff1a; 背包问题第五讲——二维费用背包问题 背包问题是一类经典的组合优化问题&#xff0c;通常涉及在限定容量的背包中…...

【mysql进阶】4-7. 通用表空间

通⽤表空间 - General Tablespace 1 通⽤表空间的作⽤和特性&#xff1f; ✅ 解答问题 通⽤表空间是使⽤ CREATE tablespace 语法创建的共享InnoDB表空间 通⽤表空间能够存储多个表的数据&#xff0c;与系统表空间类似也是共享表空间&#xff1b; 服务器运⾏时会把表空间元数…...

2024 年互联网大厂 1300 多道 JAVA 面试题汇总,包含了程序员的所有技术点

作为一个 Java 程序员&#xff0c;你平时总是陷在业务开发里&#xff0c;每天噼里啪啦忙敲着代码&#xff0c;上到系统开发&#xff0c;下到 Bug 修改&#xff0c;你感觉自己无所不能。然而偶尔的一次聚会&#xff0c;你听说和自己一起出道的同学早已经年薪 50 万&#xff0c;而…...

【开源免费】基于SpringBoot+Vue.JS在线文档管理系统(JAVA毕业设计)

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

Linux资源与网络请求

参数说明&#xff1a; d : 改变显示的更新速度&#xff0c;或是在交谈式指令列( interactive command)按 sq : 没有任何延迟的显示速度&#xff0c;如果使用者是有 superuser 的权限&#xff0c;则 top 将会以最高的优先序执行c : 切换显示模式&#xff0c;共有两种模式&#…...

RPA技术重塑企业自动化的未来

1. RPA定义与原理 1.1 机器人流程自动化(RPA)概念 机器人流程自动化&#xff08;Robotic Process Automation&#xff0c;简称RPA&#xff09;是一种软件技术&#xff0c;通过模拟人类用户在计算机界面上的操作来执行重复性的业务流程任务。RPA软件机器人能够自动执行基于规则…...

使用RabbitMQ实现延迟消息的完整指南

在分布式系统中&#xff0c;消息队列通常用于解耦服务&#xff0c;RabbitMQ是一个广泛使用的消息队列服务。延迟消息&#xff08;也称为延时队列或TTL消息&#xff09;是一种常见的场景应用&#xff0c;特别适合处理某些任务在一段时间后执行的需求&#xff0c;如订单超时处理、…...

阿里员工:阿里工作7年至少得P7吧,快的都P8了,年薪100W是正常的,80才算及格...

上一篇&#xff1a;一线体面男的收入 年薪64W的阿里蚂蚁员工爆料&#xff1a;在阿里&#xff0c;工作7年至少得P7&#xff0c;快的都P8了&#xff0c;年薪100W才正常&#xff0c;80分才算及格。 其实&#xff0c;在大厂工作&#xff0c;听起来风光无限&#xff0c;但个中滋味&a…...

Django进一步掌握(10月22日)

一、请求响应对象 请求对象request 响应对象HttpResponse 二、HttpResponse常用属性 status设置HTTP响应状态码 status_code查询HTTP响应状态码 content_type设置响应的类型 write()写入响应内容 三、重定向 1、实现URl访问的重定向 &#xff08;1&#xff09;使用Ht…...

C++从入门到起飞之——红黑树封装map和set 全方位剖析!

目录 1、map和set的整体框架 2、map和set迭代器的实现 3、map支持[] 4、完整源码 set.h map.h RBTree.h 1、map和set的整体框架 因为map和set的底层都是红黑树&#xff0c;所以我们考虑用一个红黑树的类模版去实例化map和set对象&#xff01;不过&#xff0c;map节点中存…...

【javax maven项目缺少_Maven的依赖管理 引入依赖】

javax maven项目缺少_Maven的依赖管理 引入依赖 Maven的依赖管理 - 引入依赖依赖管理(引入依赖)导入依赖 https://blog.csdn.net/weixin_28932089/article/details/112381468 Maven的依赖管理 - 引入依赖 依赖管理(引入依赖) 能够掌握依赖引入的配置方式 导入依赖 导入依赖练…...

手搓一个定时器

目录 1.什么是定时器 2.计时器的使用 3.手搓定时器 3.1定义一个TimerTask类 3.2定义一个Timer类 3.3实现schedule方法 3.4实现Timer的构造方法 3.4.1随时随地查看优先级队列中是否有任务要执行 3.4.2获取队首任务&#xff0c;并判断是否到执行时间 3.4.3到达执行时间…...

AI提示词工程优化Prompt-GPT使用手册(科普一键收藏史上最强攻略)

Prompt(提示)&#xff0c;最初是 NLP 研究者为下游任务设计出来的一种任务专属的输入形式或模板。在 ChatGPT 引发大语言模型新时代之后&#xff0c;Prompt 指与大模型交互输入的代称。 随着大模型的进展&#xff0c;Prompt Engineering是一个持久的探索过程。 目录 什么是提示…...

【数据结构】快速排序(三种实现方式)

目录 一、基本思想 二、动图演示&#xff08;hoare版&#xff09; 三、思路分析&#xff08;图文&#xff09; 四、代码实现&#xff08;hoare版&#xff09; 五、易错提醒 六、相遇场景分析 6.1 ❥ 相遇位置一定比key要小的原因 6.2 ❥ 右边为key&#xff0c;左边先走 …...

利用前向勾子获取神经网络中间层的输出并将其进行保存(示例详解)

代码示例&#xff1a; # 激活字典&#xff0c;用于保存每次的中间特征 activation {}# 将 forward_hook 函数定义在 upsample_v2 外部 def forward_hook(name):def hook(module, input, output):activation[name] output.detach()return hookdef upsample_v2(in_channels, o…...

CTF-RE 从0到N: S盒

S盒&#xff08;Substitution Box&#xff09; 是密码学中的一种替换表&#xff0c;用于对输入数据进行非线性变换&#xff0c;以增加加密过程的复杂性。它主要用于对称加密算法中&#xff08;例如AES、DES&#xff09;&#xff0c;作为加密轮次的一部分&#xff0c;对输入字节…...

MT-Pref数据集:包含18种语言的18k实例,涵盖多个领域。实验表明它能有效提升Tower模型在WMT23和FLORES基准测试中的翻译质量。

2024-10-10&#xff0c;由电信研究所、里斯本大学等联合创建MT-Pref数据集&#xff0c;它包含18种语言方向的18k实例&#xff0c;覆盖了2022年后的多个领域文本。通过在WMT23和FLORES基准测试上的实验&#xff0c;我们展示了使用MT-Pref数据集对Tower模型进行对齐可以显著提高翻…...

【C++ 真题】B2099 矩阵交换行

矩阵交换行 题目描述 给定一个 5 5 5 \times 5 55 的矩阵(数学上&#xff0c;一个 r c r \times c rc 的矩阵是一个由 r r r 行 c c c 列元素排列成的矩形阵列)&#xff0c;将第 n n n 行和第 m m m 行交换&#xff0c;输出交换后的结果。 输入格式 输入共 6 6 6 …...

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…...

MySQLDBA修炼之道-开发篇(一)

三、开发基础 1. 数据模型 1.1 关系数据模型介绍 关于NULL 如果某个字段的值是未知的或未定义的&#xff0c;数据库会提供一个特殊的值NULL来表示。NULL值很特殊&#xff0c;在关系数据库中应该小心处理。例如查询语句“select*from employee where 绩效得分<85 or>绩…...

Spring MVC 知识点全解析

Spring MVC 知识点全解析 Spring MVC 是一个基于 Java 的请求驱动的 Web 框架&#xff0c;属于 Spring 框架的一部分&#xff0c;广泛用于构建企业级 Web 应用程序。本文将详细阐述 Spring MVC 的核心知识点&#xff0c;包括其工作原理、关键组件、配置、请求处理、数据绑定、…...

python 基于FastAPI实现一个简易的在线用户统计 服务

简易在线用户统计服务 概述 这是一个基于Python的FastAPI框架实现的服务&#xff0c;用于统计客户端的心跳信息&#xff0c;并据此维护在线用户列表以及记录活跃用户数。 功能特性 心跳接收&#xff1a;接受来自客户端的心跳包&#xff0c;以更新客户端的状态。在线用户统计…...

glibc中xdr的一个bug

本人在64位linux服务器上(centos7)&#xff0c;发现xdr_u_long这个函数有个bug&#xff0c;就是数字的范围如果超过unsigned int的最大值(4294967295)时&#xff0c;xdr_u_long失败。 这个场景主要用在unix时间戳上面&#xff0c;比如一款软件&#xff0c;设置有效期为100年。…...

Android Framework定制sim卡插入解锁pin码的界面

文章目录 手机设置SIM卡pin码一、安卓手机二、苹果手机 Android Framework中SIM卡pin码代码定位pin码提示文本位置定位pin码java代码位置 定制pin码framework窗口数字按钮 手机设置SIM卡pin码 设置 SIM 卡 PIN 码可以提高手机的安全性&#xff0c;防止他人在未经授权的情况下使…...

cc2530 Basic RF 讲解 和点灯讲解(1_1)

1. Basic RF 概述 Basic RF 是 TI 提供的一套简化版的无线通信协议栈&#xff0c;旨在帮助开发者快速搭建无线通信系统。它基于 IEEE 802.15.4 标准的数据包收发&#xff0c;但只用于演示无线设备数据传输的基本方法&#xff0c;不包含完整功能的协议。Basic RF 的功能限制包括…...

中小企业网站用什么技术/网站怎么做出来的

在一些现代的扁平化设计网站&#xff0c;特别是移动端网站&#xff0c;经常会包含许多简单而清晰的小图标&#xff0c;例如网站图标、用户的默认头像、移动端网页首页底部固定的切换栏等&#xff0c;这些小图标一般都是由美工做好&#xff0c;可能会放到精灵图上&#xff0c;前…...

wordpress插件的作用/十大中文网站排名

为了画个图&#xff0c;被numpy这个模块的安装真的折腾疯了&#xff01;&#xff01;&#xff01;一直装不上&#xff0c;花了几个小时&#xff0c;看了网上的很多教程、方法发现总结得不是很全&#xff0c;这里总结一下&#xff0c;防止大家再出现这个问题没有解决方法。Pytho…...

.net 网站开发架构/深圳谷歌推广公司

与往常一样&#xff0c;升级或初始化一个新集群的用户将获得更好的性能&#xff08;例如&#xff0c;更好的并行索引扫描、合并 join 和不相关的子查询&#xff0c;更快的聚合、远程服务器上更加智能的 join 和聚合&#xff09;&#xff0c;这些都开箱即用&#xff0c;但本文中…...

南宁建设网站制作/关键词挖掘

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行&#xff0c;每行分别先给出多项式非零项的个数&#xff0c;再以指数递降方式输入一个多项式非零项系数和指数&#xff08;绝对值均为不超过1000的整数&#xff09;。数字间以空格分隔。 输出格式: 输出分2行&a…...

济南做网站知识/win7优化大师官方网站

目标 vWeb应用中初始化Spring容器 v整合Struts1.x vSpring提供的Web工具类 v整合Struts2 初始化WEBAPPLICATIONCONTEXT 在Web应用中&#xff0c;需要从WebApplicationContext中获取Spring管理的bean&#xff0c;所以需要对它进行初始化&#xff0c;Spring提供了两种方式&a…...

好的手机端网站模板下载软件/目前推广软件

1.Number.EPSILON是JS表示的最小精度 function add(a,b){if(Math.abs(a-b)<Number.EPSILON){return true;}else{return false} } console.log(add(0.10.2,0.3)) //true 2.Number.isFinite检测一个数值是否为有限数 3.Number.isNaN检测一个数值是否为NaN 4.Number.parse…...