[dfs搜索寻找矩阵中最长递减序列]魔法森林的秘密路径

魔法森林的秘密路径

题目描述

在一个遥远的国度里,存在一个神秘的魔法森林,传说中森林深处隐藏着一个古老的宝藏。这个宝藏只能通过找到森林中最长的“递减魔法路径”来解锁。这个路径由一系列魔法石组成,每个魔法石刻有不同的数字,代表着它们的魔力强度。要找到宝藏,探险者必须沿着逐渐减弱魔力的石头前进,不能回头或走对角线。你是一位著名的探险家,被国王派遣来解开这个谜团。你的任务是找出最长的递减魔法路径,这样你就能找到隐藏的宝藏。

关于输入

魔法地图上的第一行包含两个整数,表示魔法森林区域的行数 m 和列数 n。
接下来的 m 行,每行包含 n 个整数,表示每块魔法石的魔力值。
数据保证 n,m ≤ 10

关于输出

作为一位智慧的探险家,你需要计算并输出最长递减魔法路径的长度。

例子输入
3 3
2 7 8
0 11 10
8 8 9
例子输出
6

解题分析

初看此题,是在一个二维数组里面找到最长的一个连续的递减数列(注意是严格递减,不要理解错例子了),例子输入中是11--10--8--7--2--0 所以长度为6。

其实我们可以利用DFS(深度优先搜索)的办法来解决本题,并且本题的数据量并不大,所以时间也在可接受的范围之内。

这个问题是一个典型的深度优先搜索(DFS)问题。你在上述代码中使用了深度优先搜索来解决最长递减路径的问题。

1. **初始化:**首先,定义一些变量。`m`和`n`是魔法森林的大小,`map`记录了每个位置魔石的魔力值,`maxPath`保存了当前找到的最长递减路径的长度,`walk`则是一个辅助矩阵,用于记录哪些位置已经走过。你还定义了两个数组`dx`和`dy`,分别记录了从当前位置向上、下、左、右四个方向移动时横坐标和纵坐标的变化量。

2. **深度优先搜索:**`dfs`函数是核心部分,它通过深度优先搜索寻找最长的递减路径。首先,函数会更新`maxPath`为`maxPath`和`step`中的较大值,`step`表示当前路径的长度。然后,函数会标记当前位置`(x, y)`为已经走过。接着,函数会试图向四个方向进行移动,如果新位置`(nx, ny)`在森林范围内,且其魔力值小于当前位置,且尚未被走过,那么函数就会向这个新位置移动,搜索长度为`step+1`的路径。最后,当函数回溯到当前位置时,根据深度优先搜索的特性,需要将`walk[nx][ny]`重置为0,以便其他路径可以再次经过这里。

3. **主函数:**在主函数里,首先读取魔法森林的大小和每个位置的魔力值,然后从每个位置出发,使用`dfs`函数寻找最长的递减路径。最后,输出找到的最长路径的长度`maxPath`。

这个代码的时间复杂度是O(4^(m*n)),因为最坏情况下要遍历所有可能的路径,而每个位置都有四个方向可以选择。而空间复杂度是O(m*n),因为需要使用一个二维数组来记录每个位置是否已经走过。

#include <iostream>
#include <cstring>
using namespace std;

const int dx[]={0,1,-1,0},dy[]={-1,0,0,1};
int m,n,map[12][12],maxPath=0,walk[12][12]={0};

void dfs(int x,int y,int step){
    maxPath=max(maxPath,step);
    walk[x][y]=1;
    for(int i=0;i<4;i++){
        int nx=x+dx[i],ny=y+dy[i];
        if(nx>=0 && nx<m && ny>=0 && ny<n && map[nx][ny]<map[x][y] && walk[nx][ny]==0){
            dfs(nx,ny,step+1);
            walk[nx][ny]=0;
        }
    }
}

int main() {
    scanf("%d%d",&m,&n);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            scanf("%d",&map[i][j]);
        }
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            memset(walk,0,sizeof(walk));
            dfs(i,j,1);
        }
    printf("%d\n",maxPath);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/266466.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何利用PPT绘图并导出清晰图片

在写论文的过程中&#xff0c;免不了需要绘图&#xff0c;但是visio等软件绘图没有在ppt上绘图比较熟练&#xff0c;尤其流程图结构图. 但是ppt导出的图片也不够清晰&#xff0c;默认分辨率是96dpi&#xff0c;而杂志投稿一般要求至300dpi。解决办法如下&#xff1a; 1.打开注…

神经网络:机器学习基础

【一】什么是模型的偏差和方差&#xff1f; 误差&#xff08;Error&#xff09; 偏差&#xff08;Bias&#xff09; 方差&#xff08;Variance&#xff09; 噪声&#xff08;Noise&#xff09;&#xff0c;一般地&#xff0c;我们把机器学习模型的预测输出与样本的真实label…

Python自动化办公,又双叒增加功能了!

大家好,这里是程序员晚枫,今天给大家分享一下Python自动化办公,最近更新的功能。 以下代码,全部都可以免费使用哦~! 彩色的输出 有没有觉得python自带的无色输出看腻了?增加了彩色输出的功能,可以实现无痛替换。 上面效果的实现代码如下,👇 自动收发邮件 这个12月发…

采用SpringBoot框架+原生HTML、JS前后端分离模式开发和部署的电子病历编辑器源码(电子病历评级4级)

概述&#xff1a; 电子病历是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图表、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的医疗记录,是病历的一种记录形式。 医院通过电子病历以电子化方式记录患者就诊的信息&#xff0c;包括&…

Flink 数据序列化

为 Flink 量身定制的序列化框架 大家都知道现在大数据生态非常火&#xff0c;大多数技术组件都是运行在JVM上的&#xff0c;Flink也是运行在JVM上&#xff0c;基于JVM的数据分析引擎都需要将大量的数据存储在内存中&#xff0c;这就不得不面临JVM的一些问题&#xff0c;比如Ja…

第4章 | 安徽某高校《统计建模与R软件》期末复习

第4章 参数估计 参数估计是统计建模的关键步骤之一&#xff0c;它涉及根据样本数据推断总体参数的过程。在统计学中&#xff0c;参数通常用于描述总体的特征&#xff0c;如均值、方差等。通过参数估计&#xff0c;我们可以利用样本信息对这些未知参数进行推断&#xff0c;从而…

kubernetes集群 应用实践 kafka部署

kubernetes集群 应用实践 kafka部署 零.1、环境说明 零.2、kafka架构说明 zookeeper在kafka集群中的作用 一、Broker注册 二、Topic注册 三、Topic Partition选主 四、生产者负载均衡 五、消费者负载均衡 一、持久化存储资源准备 1.1 创建共享目录 [rootnfsserver ~]# mkdir -…

深度学习 | 基础卷积神经网络

卷积神经网络是人脸识别、自动驾驶汽车等大多数计算机视觉应用的支柱。可以认为是一种特殊的神经网络架构&#xff0c;其中基本的矩阵乘法运算被卷积运算取代&#xff0c;专门处理具有网格状拓扑结构的数据。 1、全连接层的问题 1.1、全连接层的问题 “全连接层”的特点是每个…

用C的递归函数求n!-----(C每日一编程)

用递归函数求n&#xff01; 有了上面这个递归公式就能写C代码了。 参考代码&#xff1a; int fac(int n) {if (n 1 || n 0)return 1;else return n * fac(n - 1); } void main() {int n;scanf("%d",&n);int f fac(n);printf("\n%d!%d\n", n, f); …

linux设置线程优先级以及调度策略浅析

linux线程调度策略 Linux内核会根据线程的优先级和调度策略来分配处理器时间。线程的优先级越高&#xff0c;它在竞争处理器时间时就越有可能被选中执行。调度策略定义了内核在选择下一个要执行的线程时所遵循的规则。 在Linux中&#xff0c;有以下几种常见的调度策略&#x…

【iOS】UICollectionView

文章目录 前言一、实现简单九宫格布局二、UICollectionView中的常用方法和属性1.UICollectionViewFlowLayout相关属性2.UICollectionView相关属性 三、协议和代理方法&#xff1a;四、九宫格式的布局进行升级五、实现瀑布流布局实现思路实现原理代码调用顺序实现步骤实现效果 总…

ospf学习纪要

1、为避免区域&#xff08;area0,area1等&#xff09;间的路由形成环路&#xff0c;非骨干区域之间不允许直接相互发布区域间的路由。因此&#xff0c;所有的ABR&#xff08;Area Border Router,区域边界路由器&#xff09;都至少有一个借口属于Area0,所以Area0始终包含所有的A…

深度学习第6天:ResNet深度残差网络

☁️主页 Nowl &#x1f525;专栏 《深度学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 什么是ResNet模型结构整体架构残差块 模型特性示例代码 什么是ResNet ResNet是一种用于图像识别的深度残差网络&#xff0c;是卷积神经网络的一种重要模型&…

哈希拓展攻击CTF题做法

目录 基础&#xff1a; 盐&#xff08;Salt&#xff09;&#xff1a; 哈希长度拓展攻击&#xff1a; kali下载相关工具hash-ext-attack&#xff1a; hash拓展题目特征&#xff1a; 哈希拓展ctf题&#xff1a; 2023楚慧杯upload_shell 实验吧之让我进去&#xff1a; 前言…

【量化金融】证券投资学

韭菜的自我修养 第一章&#xff1a; 基本框架和概念1.1 大盘底部形成的技术条件1.2 牛市与熊市1.3 交易系统1.3.1 树懒型交易系统1.3.2 止损止损的4个技术 第二章&#xff1a;证券家族4兄弟2.1 债券&#xff08;1&#xff09;债券&#xff0c;是伟大的创新&#xff08;2&#x…

Kafka日志

位置 server.properties配置文件中通过log.dir指定日志存储目录 log.dir/{topic}-{partition} 核心文件 .log 存储消息的日志文件&#xff0c;固定大小为1G&#xff0c;写满后会新增一个文件&#xff0c;文件名表示当前日志文件记录的第一条消息的偏移量。 .index 以偏移…

【Spring实战】04 Lombok集成及常用注解

文章目录 0. 集成1. Data2. Getter 和 Setter3. NoArgsConstructor&#xff0c;AllArgsConstructor和RequiredArgsConstructor4. ToString5. EqualsAndHashCode6. NonNull7. Builder总结 Lombok 是一款 Java 开发的工具&#xff0c;它通过注解的方式简化了 Java 代码的编写&…

nodejs+vue+微信小程序+python+PHP计算机网络在线考试系统-计算机毕业设计推荐

信息数据的处理完全依赖人工进行操作&#xff0c; 所以电子化信息管理的出现就能缓解以及改变传统人工方式面临的处境&#xff0c;一方面可以确保信息数据在短时间被高效处理&#xff0c;还能节省人力成本&#xff0c;另一方面可以确保信息数据的安全性&#xff0c;可靠性&…

SQL进阶理论篇(二十):什么是SQL注入

文章目录 简介SQL注入的原理SQL注入的实例搭建sqli-labs注入环境实例一&#xff1a;猜测where条件判断查询语句的字段数获取当前数据库和用户信息获取MySQL中的所有数据库名称查询wucai数据库中的所有数据表查询heros数据表中的所有字段参考文献 简介 这节是纯兴趣篇了。 web…

【快速开发】使用SvelteKit

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…