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

[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;
}

相关文章:

  • [ZJCTF 2019]NiZhuanSiWei1
  • OpenAI 官方 Prompt 工程指南:写好 Prompt 的六个策略
  • 基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else
  • [THUPC 2024 初赛] 二进制 (树状数组单点删除+单点查询)(双堆模拟set)
  • Opencv入门五 (显示图片灰度值)
  • pytest常用命令行参数
  • 5 分钟内搭建一个免费问答机器人:Milvus + LangChain
  • 回溯算法 典型习题
  • Prompt-to-Prompt:基于 cross-attention 控制的图像编辑技术
  • 使用互斥锁(Mutex)管理共享资源
  • nodejs+vue+ElementUi会员制停车场车位系统
  • 最新版android stuido加上namespace
  • 【接口测试】如何定位BUG的产生原因
  • qt简单连接摄像头
  • 论文阅读——Flamingo
  • .pyc 想到的一些问题
  • 03Go 类型总结
  • Angularjs之国际化
  • CSS 专业技巧
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • log4j2输出到kafka
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React中的“虫洞”——Context
  • Vue.js 移动端适配之 vw 解决方案
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • Web标准制定过程
  • WePY 在小程序性能调优上做出的探究
  • 从输入URL到页面加载发生了什么
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 京东美团研发面经
  • 区块链共识机制优缺点对比都是什么
  • 如何实现 font-size 的响应式
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 设计模式(12)迭代器模式(讲解+应用)
  • 实习面试笔记
  • 我与Jetbrains的这些年
  • 线上 python http server profile 实践
  • ionic入门之数据绑定显示-1
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • #NOIP 2014#Day.2 T3 解方程
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • ${ }的特别功能
  • (1)STL算法之遍历容器
  • (4)(4.6) Triducer
  • (HAL库版)freeRTOS移植STMF103
  • (Java)【深基9.例1】选举学生会
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (初研) Sentence-embedding fine-tune notebook
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (翻译)terry crowley: 写给程序员
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (一)插入排序
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET Core WebAPI中封装Swagger配置