二分搜索+DFS
2013-05-13 09:50
218 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=306
题目大意:给一个 n*n 的迷宫,迷宫每一格有一个整数表示该点的难度值,求从(1,1)到(n,n)的所用路径中,难度差最小是多少。
题目大意:给一个 n*n 的迷宫,迷宫每一格有一个整数表示该点的难度值,求从(1,1)到(n,n)的所用路径中,难度差最小是多少。
#include<stdio.h> #include<string.h> #define N 101 #define INF 0x7fffffff int map ,visit ; int n,H,L,flag; int dir[4][2]={1,0,-1,0,0,1,0,-1}; void DFS(int x,int y) { int i,next_x,next_y; if(flag)return ; visit[x][y]=1; if(map[x][y]<L || map[x][y]>H) return ; if(x==n && y==n){ flag=1; return; } for(i=0;i<4;i++){ next_x=x+dir[i][0]; next_y=y+dir[i][1]; if(next_x>=1 && next_x<=n && next_y>=1 && next_y<=n && !visit[next_x][next_y]){ DFS(next_x,next_y); } } } int main() { int i,j; int max,min; int hight,mid,low; while(scanf("%d",&n)!=EOF){ min=INF; max=-1; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ scanf("%d",&map[i][j]); if(map[i][j]<min)min=map[i][j]; if(map[i][j]>max)max=map[i][j]; } } hight=max-min; low=0; while(hight>=low){ mid=(hight+low)/2; for(i=min;i<=max-mid;i++){ H=i+mid;L=i;flag=0;//搜索范围[L,H](即[i,i+mid]),区间长度为mid,mid越大搜索范围越大 memset(visit,0,sizeof(visit)); DFS(1,1); if(flag)break; } if(i<=max-mid)hight=mid-1;//当前范围内能找到,mid变小,缩小搜索范围; else low=mid+1;//当前范围内找不到,扩大搜索范围; } printf("%d\n",hight+1); } return 0; }
相关文章推荐
- NYOJ306 走迷宫(dfs+二分搜索)
- PAT甲题题解-1115. Counting Nodes in a BST (30)-(构建二分搜索树+dfs)
- Fence Rails USACO 4.1(继续阵亡,DFSID+二分搜索+剩余记录)
- NYOJ306 走迷宫(dfs+二分搜索)
- [BZOJ 1052] 覆盖问题 二分+搜索(DFS)+贪心
- poj3061----二分搜索的应用
- zoj 1002 Fire Net (DFS搜索)
- 深度搜索与回溯方法不同点 Difference between DFS and Backtracking
- POJ 3258 River Hopscotch (二分搜索)
- 【leetcode】34Search for a Range(二分搜索上下界)
- 记忆化搜索POJ-1088(dfs+dp)
- POJ---3579(Median,二分搜索)
- POJ 3273 Monthly Expense 二分搜索
- AsiaHatyai-2012 & LA 6144 - Radiation 二分搜索+集合运算
- POJ 3104 Drying 二分搜索
- POJ 2034 反素数,素数筛选,DFS暴力搜索
- 01分数规划+二分搜索
- Monthly Expense--CSU-ACM2017暑假集训2-二分搜索
- 二分搜索的3种正确写法
- HDOJ 2899 二分搜索