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

时间:2022-08-26 20:44:25

题目描写叙述

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<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cmath>
#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]<i||vmap[1][1]>i+k) continue;
if(vmap[n][n]<i||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(l<r){
int 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;
}

NYOJ306 走迷宫(dfs+二分搜索)的更多相关文章

  1. luogu P1238 走迷宫--DFS模板好(水)题

    题目描述 有一个m*n格的迷宫(表示有m行.n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,文件读入这m*n个数据和起始点.结束点(起始点和结束点都是用两个数据来描述的,分别表示 ...

  2. openjudge走迷宫&lpar;DFS&rpar;

    题目: 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  3. 走迷宫&lpar;DFS&rpar;

    题目:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=2449&cid=1181 目前dfs 里的递归还是不很懂,AC代码如下: #incl ...

  4. sdut1269 走迷宫&lpar;dfs&rpar;

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1269 连着做了三个基本的dfs,终于弄懂了搜索 ...

  5. HDU&lowbar;1010——小狗走迷宫DFS

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  6. sdut 2449走迷宫【最简单的dfs应用】

    走迷宫 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_ 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m) ...

  7. HDU 2102 A计划&lpar;BFS&sol;DFS走迷宫&rpar;

    A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  8. 数据结构之 栈与队列--- 走迷宫(深度搜索dfs)

    走迷宫 Time Limit: 1000MS Memory limit: 65536K 题目描述 一个由n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方 ...

  9. 百炼3752&colon;走迷宫--栈实现dfs

    3752:走迷宫 总时间限制:  1000ms 内存限制:  65536kB 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最 ...

随机推荐

  1. Java(Helloworld&period;java)

    public class A{ public static void main(String args[]){ System.out.println("Hello world!") ...

  2. Coding the Matrix &lpar;0&rpar;:映射、复数和域

    1. 非常好的 Python 教程 <深入 Python 3.0> 以及 IBM 开发社区的博客探索 Python. 2. 子集: s 是 S 的子集 >>>S = {2 ...

  3. xode View 的封装

    1.Xcode自带头文件的路径 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Develo ...

  4. ubuntu intelliJ IDEA 12&period;1&period;4 安装

    1 php插件 http://plugins.jetbrains.com/plugin/?id=6610 把插件下载到一个目录下,如果插件不兼容,多试几个版本! 2 打开ide, FILE -> ...

  5. HDU-4974 A simple water problem

    http://acm.hdu.edu.cn/showproblem.php?pid=4974 话说是签到题,我也不懂什么是签到题. A simple water problem Time Limit: ...

  6. DoingOrder&period;aspx&period;cs缓存的使用方法

    using System; using System.Web.UI; using System.Data; using System.Text; using BLL = SmartWaterSys.B ...

  7. CentOS6&period;5与XP双系统安装

    因为工作的须要,须要安装一个XP系统和一个CentOS系统.依照在网上找到的一些方法尝试了下,结果都不是非常理想.最后,经过尝试和寻找,找到了一个比較方便的方法. 一.分区 本人的电脑硬盘是500G, ...

  8. android压缩解压zip文件

    网上各种方法的收集: 1.上次写了个解压缩功能,但有局限性,比如压缩文件xx.zip 里包括子目录的情况下,执行上次解压缩的功能就不能实现我们想要的效果,于是在网上参考了一下java的解压缩功能.对上 ...

  9. php设计模式——UML类图

    前言 用php开发两年多了,准备也写一下平时常用的设计模式,都是基于自己的实践经验,当然,用设计模式之前首先要看懂设计模式,因此这里首先讲解一下UML类图.通过UML类图,能更好的和大家交流,也能很容 ...

  10. 剑指Offer——网易笔试之解救小易——曼哈顿距离的典型应用

    剑指Offer--网易笔试之解救小易--曼哈顿距离的典型应用 前言 首先介绍一下曼哈顿,曼哈顿是一个极为繁华的街区,高楼林立,街道纵横,从A地点到达B地点没有直线路径,必须绕道,而且至少要经C地点,走 ...