热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NYOJ306走迷宫(dfs+二分搜索)

题目描述http:acm.nyist.netJudgeOnlineproblem.php?pid306Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场

题目描述
http://acm.nyist.net/JudgeOnline/problem.php?pid=306
Dr.Kong设计的机器人卡多非常爱玩,它常常偷偷跑出实验室,在某个游乐场玩之不疲。这天卡多又跑出来了,在SJTL游乐场玩个不停,坐完碰碰车,又玩滑滑梯,这时卡多又走入一个迷宫。整个迷宫是用一个N * N的方阵给出,方阵中单元格中填充了一个整数,表示走到这个位置的难度。

这个迷宫可以向上走,向下走,向右走,向左走,但是不能穿越对角线。走迷宫的取胜规则很有意思,看谁能更快地找到一条路径,其路径上单元格最大难度值与最小难度值之差是最小的。当然了,或许这样的路径不是最短路径。

     机器人卡多现在在迷宫的左上角(第一行,第一列)而出口在迷宫的右下角(第N行,第N列)。

卡多很聪明,很快就找到了这样的一条路径。你能找到吗?

输入
有多组测试数据,以EOF为输入结束的标志
第一行: N 表示迷宫是N*N方阵 (2≤ N≤ 100)
接下来有N行, 每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。
输出
输出为一个整数,表示路径上最高难度与和最低难度的差。
样例输入

5
1 1 3 6 8
1 2 2 5 5
4 4 0 3 3
8 0 2 3 4
4 3 0 2 1

样例输出

2

题目分析:
对于每一个答案的范围,dfs判断对于当前范围值是否能否从(1,1)到达(n,n)。如果能找到某一路径到达(n,n),则证明当前答案能够满足要求,还可以继续减小。我们可以二分[0,max-min]之间的值,进行判断即可。

AC代码:

/** *@xiaoran *dfs+二分搜索 *迷宫可以向上走,向下走,向右走,向左走 *从(1,1)到(n,n)能否找到一条路径, *其路径上单元格最大难度值与最小难度值之差是最小的 */
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
using namespace std;
/** *minn:地图中的最小值, *maxn:地图中的最大值, *flag:标记差值在某个范围内是否能够到达(n,n) *vmap[][]:地图 *vis[i][j]:该节点是否已被访问 *dx[],dy[]:搜索四个方向 */
int n,minn,maxn,flag;
int vis[120][120],vmap[120][120];
int dx[]={0,0,1,-1},dy[]={1,-1,0,0};

void Init(){
    minn=121;
    maxn=-1;
    memset(vmap,-1,sizeof(vmap));//这里一定要赋值为小于0或者大于120的值
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            scanf("%d",&vmap[i][j]);
            maxn=max(vmap[i][j],maxn);
            minn=min(vmap[i][j],minn);
        }
    }
}

/** *差值在R-L的范围内是否存在从(1,1)-->(n,n)的路径 *这里判断的是每一值是否在[L,R]之间· */
void dfs(int i,int j,int L,int R){
    if(flag) return;
    if(i==n&&j==n){//能够找到有效路径,返回,不在搜素其他值
        flag=1; return;
    }
    for(int k=0;k<4;k++){
        int xi=i+dx[k];
        int xj=j+dy[k];
        if(vmap[xi][xj]>=L&&vmap[xi][xj]<=R&&vis[xi][xj]==0){
            //改点的值满足条件且未被访问。
            vis[xi][xj]=1;//这里一定要先标记啊
            dfs(xi,xj,L,R);
        }

    }
}

/** *用来判断当差值为k时,是否满足能够找到从(1,1)-->(n,n)的路径 */
int Judge(int k){
    for(int i=minn;i<=maxn-k;i++){
        flag=0;//先标记没有合法路径
        //因为dfs函数中没有判断vmap[1][1]和vmap[n][n]是否合法,这里要特判
        if(vmap[1][1]1][1]>i+k) continue;
        if(vmap[n][n]i+k) continue;


        memset(vis,0,sizeof(vis));
        vis[1][1]=1;//从(1,1)访问
        dfs(1,1,i,i+k);
        if(flag) return 1;//可以找到有效路径从(1,1)-->(n,n)
    }
    return 0;
}

int Get_ans(){
    int l=0,r=maxn-minn;
    while(lint mid=(l+r)/2;
        if(Judge(mid)){//当前值mid合法,还可以继续减小搜素
            r=mid;
        }
        else l=mid+1;
    }
    return r;//return l;
}


int main()
{
    while(~scanf("%d",&n)){
        Init();
        printf("%d\n",Get_ans());
    }
    return 0;
}

推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文探讨了如何在给定整数N的情况下,找到两个不同的整数a和b,使得它们的和最大,并且满足特定的数学条件。 ... [详细]
  • 本文详细探讨了VxWorks操作系统中双向链表和环形缓冲区的实现原理及使用方法,通过具体示例代码加深理解。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • This guide provides a comprehensive step-by-step approach to successfully installing the MongoDB PHP driver on XAMPP for macOS, ensuring a smooth and efficient setup process. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
author-avatar
拍友2502878393
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有