nyoj306-走迷宫(dfs,二分枚举上下界)
来源:互联网 发布:减少睡眠时间知乎 编辑:程序博客网 时间:2024/05/16 12:27
题目来源: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[N][N],vis[N][N];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); }}
阅读全文
0 0
- nyoj306-走迷宫(dfs,二分枚举上下界)
- nyoj306 走迷宫(二分+dfs)
- NYOJ306 走迷宫(dfs+二分搜索)
- NYOJ306 走迷宫(二分+深搜DFS)
- nyoj306 走迷宫(搜索+二分)
- D题 走迷宫(dfs+二分枚举)
- nyoj306(走迷宫)
- ★nyoj306(二分+dfs 好题)
- nyoj306 二分+dfs
- 走迷宫(Dfs)
- 第四届河南省省赛 走迷宫(二分+DFS)
- NYOJ-306走迷宫(二分查找+DFS)
- Dfs+二分搜索(台州4310 走迷宫)
- SDUT 走迷宫(DFS)
- 自动走迷宫(DFS)
- 【原创】浅谈搜索(上-dfs与队列)(迷宫,走迷宫)
- 第四届河南省acm省赛 走迷宫(二分法枚举差值和最大值最小值+DFS)
- nyoj 306 4th河南省赛 走迷宫【dfs】【二分】
- MAC Python IDLE中文
- 语音识别(ASR)-GMM-HMM推导
- UBUNTU系统连不上WIFI问题( Qualcomm Atheros Device 0042 )
- 使用Git进行版本控制
- LeetCode 48. Rotate Image
- nyoj306-走迷宫(dfs,二分枚举上下界)
- javascript中使用EL表但是一定要注意 符号区别
- docker 配置国内镜像源 linux/mac/windows
- MySQL主键、外键以及子表的删除、更新约束
- JavaScript专精系列(7)——最佳实践篇
- go语言学习-常量
- 8086微处理器介绍
- 异步加载基础
- Java相对路径/绝对路径总结(转)