nyoj306 二分+dfs

本文探讨了一个迷宫问题,目标是从起点到终点找到一条路径,使得路径上最大点与最小点的差值最小。通过分析数据范围,采用二分查找法优化搜索过程,提高了解决效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题连接:点击打开链接
题意:从(1,1)点到(n,n)找一条路径(只能上下左右走),使路径上最大点与最小点差值最小。。

思路分析:
(1):这题和我们以前做的迷宫题差别很大,以前做的一般就是求 最小步数或代价最小,一个dfs或bfs即可,而此题是求最大点与最小点差。 www.2cto.com
(2):分析看出,一次dfs和bfs对我等弱菜来说显然不可(大牛或许可以)。
(3):若直接搜索,那些点该搜,那些点不该搜,显然是没法进行……
(4):看数据范围值在结果就在 (0,120 )之间,我们就可假设一个当前答案搜索!!不断更新。。
(5):根据输入的迷宫各点值 ,我们可以找出最大值 mmax 和最小值 mmin,若当前答案是0 ,那要最多要搜索mmax-0 -mmin次,第一次可以搜的点值区间在(mmin,mmin+0);看是否能找出路……若不能,下次可以搜索的点值区间在(min+1,mmin+0+1);看是否能找出路径,……若不能,下次可以搜索点值区间在(min+2,min+0+2)……直到最后一次可搜索的点值区间是(mmax-0,mmax)……;在每次搜索中的,只要一次能搜到路径,即说明当前答案是可行的。。特别注意::该当前答案搜出的满足该答案的路径 是最大值和最小值差在 当前答案内!!并不是差就是当前答案。。
(6):可以先求出mmax,mmin,得到答案范围,(0,mmax-mmin);可以先假设当前答案是 mmax-mmin 依次向0 搜索,中间搜不出满足当前答案的路径,那么正确答案就出来了!!即当前 答案+1。若能就一直向前搜索,直到 -1。
(7):(6)中的方法对于弱数据是可以ac的。。但是有没有更高效率思路??看(6)中每次搜索的当前答案,是线性的!!,那么就可以用 二分 来枚举当前答案,时间复杂度 log(mmax-mmin)不就更快了……
AC代码:
[cpp] 
  
#include<stdio.h> 
#include<string.h> 
#include<iostream> 
using namespace std; 
int map[150][150],mmax,mmin,flag; 
int n,sx[]={1,-1,0,0},zy[]={0,0,1,-1}; 
int loop[150][150]; 
void init() 

    int i,j; 
    mmax=-1; 
    mmin=999999; 
    memset(map,-1,sizeof(map)); 
    for(i=1;i<=n;i++) 
      for(j=1;j<=n;j++) 
        { 
            scanf("%d",&map[i][j]); 
            mmax= max(mmax,map[i][j]); 
            mmin= min(mmin,map[i][j]); 
        } 

void dfs(int x,int y,int L,int R) 

    if(flag)  return; 
    if(x==n&&y==n) {flag=1;return;} 
    int i,j; 
    for(i=0;i<4;i++) 
    { 
        int xx=x+sx[i]; 
        int xy=y+zy[i]; 
        if(map[xx][xy]>=L&&map[xx][xy]<=R&&loop[xx][xy]==0) 
          {loop[xx][xy]=1;dfs(xx,xy,L,R);} 
    } 
 

bool find(int k) 

    int i,j; 
    for(i=mmin;i<=mmax-k;i++) 
    { 
        flag=0; 
        if(map[1][1]<i||map[1][1]>i+k) continue; 
        if(map[n][n]<i||map[n][n]>i+k) continue; 
        memset(loop,0,sizeof(loop)); 
        loop[1][1]=1; 
        dfs(1,1,i,i+k); 
        if(flag) 
          return true; 
    } 
    return false; 

int find_answer() 

    int i,j,x=0,y=mmax-mmin; 
    while(x<y) 
    { 
        //printf("x,y--->>  %d %d\n",x,y); 
        int mid=(x+y)/2; 
        if(find(mid)) 
        { 
            //printf("mid----%d\n",mid); 
            y=mid; 
        } 
        else 
           x=mid+1; 
    } 
    return y; 

int main() 

    //freopen("g:\\Input.txt","r",stdin); 
    //freopen("g:\\out.txt","w",stdout); 
    int m; 
    while(~scanf("%d",&n)) 
    { 
        init(); 
        m=find_answer(); 
        printf("%d\n",m); 
    } 
}         

基于数据挖掘的音乐推荐系统设计与实现 需要一个代码说明,不需要论文 采用python语言,django框架,mysql数据库开发 编程环境:pycharm,mysql8.0 系统分为前台+后台模式开发 网站前台: 用户注册, 登录 搜索音乐,音乐欣赏(可以在线进行播放) 用户登陆时选择相关感兴趣的音乐风格 音乐收藏 音乐推荐算法:(重点) 本课题需要大量用户行为(如播放记录、收藏列表)、音乐特征(如音频特征、歌曲元数据)等数据 (1)根据用户之间相似性或关联性,给一个用户推荐与其相似或有关联的其他用户所感兴趣的音乐; (2)根据音乐之间的相似性或关联性,给一个用户推荐与其感兴趣的音乐相似或有关联的其他音乐。 基于用户的推荐和基于物品的推荐 其中基于用户的推荐是基于用户的相似度找出相似相似用户,然后向目标用户推荐其相似用户喜欢的东西(和你类似的人也喜欢**东西); 而基于物品的推荐是基于物品的相似度找出相似的物品做推荐(喜欢该音乐的人还喜欢了**音乐); 管理员 管理员信息管理 注册用户管理,审核 音乐爬虫(爬虫方式爬取网站音乐数据) 音乐信息管理(上传歌曲MP3,以便前台播放) 音乐收藏管理 用户 用户资料修改 我的音乐收藏 完整前后端源码,部署后可正常运行! 环境说明 开发语言:python后端 python版本:3.7 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:pycharm
MPU6050是一款广泛应用在无人机、机器人和运动设备中的六轴姿态传感器,它集成了三轴陀螺仪和三轴加速度计。这款传感器能够实时监测并提供设备的角速度和线性加速度数据,对于理解物体的动态运动状态至关重要。在Arduino平台上,通过特定的库文件可以方便地与MPU6050进行通信,获取并解析传感器数据。 `MPU6050.cpp`和`MPU6050.h`是Arduino库的关键组成部分。`MPU6050.h`是头文件,包含了定义传感器接口和函数声明。它定义了类`MPU6050`,该类包含了初始化传感器、读取数据等方法。例如,`begin()`函数用于设置传感器的工作模式和I2C地址,`getAcceleration()`和`getGyroscope()`则分别用于获取加速度和角速度数据。 在Arduino项目中,首先需要包含`MPU6050.h`头文件,然后创建`MPU6050`对象,并调用`begin()`函数初始化传感器。之后,可以通过循环调用`getAcceleration()`和`getGyroscope()`来不断更新传感器读数。为了处理这些原始数据,通常还需要进行校准和滤波,以消除噪声和漂移。 I2C通信协议是MPU6050与Arduino交互的基础,它是一种低引脚数的串行通信协议,允许多个设备共享一对数据线。Arduino板上的Wire库提供了I2C通信的底层支持,使得用户无需深入了解通信细节,就能方便地与MPU6050交互。 MPU6050传感器的数据包括加速度(X、Y、Z轴)和角速度(同样为X、Y、Z轴)。加速度数据可以用来计算物体的静态位置和动态运动,而角速度数据则能反映物体转动的速度。结合这两个数据,可以进一步计算出物体的姿态(如角度和角速度变化)。 在嵌入式开发领域,特别是使用STM32微控制器时,也可以找到类似的库来驱动MPU6050。STM32通常具有更强大的处理能力和更多的GPIO口,可以实现更复杂的控制算法。然而,基本的传感器操作流程和数据处理原理与Arduino平台相似。 在实际应用中,除了基本的传感器读取,还可能涉及到温度补偿、低功耗模式设置、DMP(数字运动处理器)功能的利用等高级特性。DMP可以帮助处理传感器数据,实现更高级的运动估计,减轻主控制器的计算负担。 MPU6050是一个强大的六轴传感器,广泛应用于各种需要实时运动追踪的项目中。通过 Arduino 或 STM32 的库文件,开发者可以轻松地与传感器交互,获取并处理数据,实现各种创新应用。博客和其他开源资源是学习和解决问题的重要途径,通过这些资源,开发者可以获得关于MPU6050的详细信息和实践指南
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值