NYOJ306 走迷宫(dfs+二分搜索)
来源:互联网 发布:淘宝双十一晚会直播 编辑:程序博客网 时间:2024/05/16 03:03
题目描述
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)。
输出
输出为一个整数,表示路径上最高难度与和最低难度的差。
样例输入
51 1 3 6 81 2 2 5 54 4 0 3 38 0 2 3 44 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 longusing 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;}
2 0
- NYOJ306 走迷宫(dfs+二分搜索)
- nyoj306 走迷宫(搜索+二分)
- nyoj306 走迷宫(二分+dfs)
- NYOJ306 走迷宫(二分+深搜DFS)
- nyoj306-走迷宫(dfs,二分枚举上下界)
- Dfs+二分搜索(台州4310 走迷宫)
- nyoj306(走迷宫)
- nyoj306 二分+dfs
- nyoj306 二分搜索
- DFS深度优先搜索之走迷宫
- 深度优先搜索DFS 走迷宫
- dfs走迷宫_深度优先搜索
- NYOJ 306 走迷宫 【二分+搜索】
- ★nyoj306(二分+dfs 好题)
- nyoj 306 4th河南省赛 走迷宫【dfs】【二分】
- 第四届河南省省赛 走迷宫(二分+DFS)
- D题 走迷宫(dfs+二分枚举)
- NYOJ-306走迷宫(二分查找+DFS)
- palyframework学习日记一二三四
- 数组-12. 简易连连看(20)
- 漫游Kafka设计篇之Producer和Consumer
- Linux中Man Page的含义
- 黑马程序员一NSSet, NSDictionary
- NYOJ306 走迷宫(dfs+二分搜索)
- Codeforces Round #291 (Div. 2)E(DP+矩阵)
- 漫游Kafka设计篇之主从同步
- Fusionchart
- CodeChef March Challenge 2015
- Android Studio 如何引用 .so文件
- java基础面试题
- 漫游Kafka实战篇之客户端API
- 自制 Sublime Text 主题