博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
COJ1143(走迷宫)
阅读量:5144 次
发布时间:2019-06-13

本文共 1862 字,大约阅读时间需要 6 分钟。

Description

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

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

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

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

Input

有多组测试数据,以EOF为输入结束的标志

第一行: N 表示迷宫是N*N方阵 (2≤ N≤ 100)
接下来有N行, 每一行包含N个整数,用来表示每个单元格中难度 (0≤任意难度≤120)。

Output

输出为一个整数,表示路径上最高难度与和最低难度的差。

Sample Input

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

Sample Output

2
 
这题放了很久了,以前用dfs暴搜总是超时,也想不到什么好的剪枝方法,所以一直没A,今天突然想到可以用二分来枚举难度差,用dfs来判断能否在给定的难度差下完成任务,这样处理后复杂度骤降,自然也就AC了。
View Code
#include 
#include
#define MIN(a,b) ((a)<(b)?(a):(b))#define MAX(a,b) ((a)>(b)?(a):(b))#define N 100int dx[4]={
0,0,1,-1};int dy[4]={
1,-1,0,0};int map[N][N],vis[N][N];int n,L,H;int small,big;bool success;void dfs(int x,int y){ int i,nx,ny; if(map[x][y]
H) return; if(x==n-1 && y==n-1) { success=true; return; } for(i=0;i<4;i++) { nx=x+dx[i]; ny=y+dy[i]; if(nx<0 || nx>=n || ny<0 || ny>=n || vis[nx][ny]) continue; vis[nx][ny]=1; dfs(nx,ny); }}bool judge(int d){ int i; for(i=small;i+d<=big;i++) { L=i; H=i+d; success=false; memset(vis,0,sizeof(vis)); vis[0][0]=1; dfs(0,0); if(success) break; } if(i+d<=big) return true; return false;}int main(){ int i,j; int min,max,mid; while(~scanf("%d",&n)) { small=120; big=0; for(i=0;i
>1; if(judge(mid)) max=mid; else min=mid; } printf("%d\n",max); } return 0;}

 

转载于:https://www.cnblogs.com/algorithms/archive/2012/07/10/2584420.html

你可能感兴趣的文章
Java学习 · 初识 面向对象深入一
查看>>
源代码如何管理
查看>>
vue怎么将一个组件引入另一个组件?
查看>>
多线程学习笔记三之ReentrantLock与AQS实现分析
查看>>
【转】进程与线程的一个简单解释
查看>>
getopt,getoptlong学习
查看>>
数据的传递 变量与参数的使用
查看>>
Razor项目所感(上)
查看>>
笔记《精通css》第2章 选择器,注释
查看>>
android程序完全退出步骤
查看>>
bzoj1040: [ZJOI2008]骑士
查看>>
51单片机存储器结构
查看>>
Windows10实用技巧-固定快捷方式到磁贴菜单方式
查看>>
mime.go
查看>>
微信公众平台接口配置问题
查看>>
SQL查询记录添加序号(HANA)
查看>>
LeetCode 74. Search a 2D Matrix(搜索二维矩阵)
查看>>
利用SignalR来同步更新Winfrom
查看>>
java中的静态方法
查看>>
反射机制
查看>>