nyoj306-走迷宫(dfs,二分枚举上下界)
2017-11-26 01:37
429 查看
题目来源:http:///problem.php?pid=306
题意
中文。。。。。。思路
先是暴力dfs了一发,然后在他的基础上去二分差值进行多次dfs,最后才发现可以利用二分去枚举权值的上下界。。。。(长知识了)代码
#include<cmath> #include<stack> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int INF=0x3f3f3f3f; const int N=100+10; int mp ,vis ; int d[4][2]= {{1,0},{0,1},{-1,0},{0,-1}}; int n,flag; //二分差值,枚举上下界 bool judge(int x,int y,int l,int r) { if(!vis[x][y]&&x<=n&&y<=n&&x>0&&y>0)//注意。。太长了 return 1; return 0; } void dfs(int x,int y,int l,int r) { if(flag) return; if(mp[x][y]<l||mp[x][y]>r) return; if(x==n&&y==n) { flag=1; return; } for(int i=0; i<4; i++) { int xx=x+d[i][0]; int yy=y+d[i][1]; if(judge(xx,yy,l,r)) { vis[xx][yy]=1; dfs(xx,yy,l,r); // vis[xx][yy]=0; } } } int ml,mr; bool solve(int mid) { flag=0; for(int i=ml;i<=mr-mid;i++) { int l=i,r=i+mid; memset(vis,0,sizeof(vis)); vis[1][1]=1; dfs(1,1,l,r); if(flag) return 1; } return 0; } int main() { while(scanf("%d",&n)!=EOF) { mr=-1,ml=INF; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { scanf("%d",&mp[i][j]); ml=ml>mp[i][j]?mp[i][j]:ml; mr=mr>mp[i][j]?mr:mp[i][j]; } int l=0,r=mr-ml,mid; while(l<r) { mid=(l+r)/2; if(solve(mid)) r=mid; else l=mid+1; } printf("%d\n",r); } }
相关文章推荐
- NYOJ-306走迷宫(二分查找+DFS)
- NYOJ306 走迷宫(dfs+二分搜索)
- nyoj306 走迷宫(二分+dfs)
- NYOJ306 走迷宫(dfs+二分搜索)
- NYOJ306 走迷宫(二分+深搜DFS)
- nyoj306 走迷宫(搜索+二分)
- nyoj 306 4th河南省赛 走迷宫【dfs】【二分】
- DFS+二分_NYOJ_306
- nyoj 306 二分+dfs
- nyoj 306 二分+dfs
- D题 走迷宫(dfs+二分枚举)
- NYOJ 306 走迷宫(DFS+二分法)
- ★nyoj306(二分+dfs 好题)
- nyoj-306-走迷宫【dfs】【好题】
- NYOJ-586 疯牛(二分枚举+贪心)
- NYOJ 32 组合数(枚举,dfs)
- nyoj 586 疯牛和nyoj 619 青蛙过桥 二分枚举+贪心
- nyoj——58 最小步数(DFS,BFS 迷宫问题)
- poj 2157 Maze 枚举排列+dfs搜迷宫
- NYOJ499 迷宫 DFS