DFS+二分_NYOJ_306
来源:互联网 发布:什么是好的相声知乎 编辑:程序博客网 时间:2024/04/30 21:01
题意:
在n*n的矩阵中,寻找(1,1)->(n,n)的路径中,最大值和最小值差值最小
解:二分差值(差值肯定<=max(矩阵)-min(矩阵)和在[n][n]-[0][0]之间),枚举最小值,看能否找到一条路,特别的,注意起点的判断/http://acm.nyist.net/JudgeOnline/problem.php?pid=306&rec=sim/,
#include<iostream>#include<cstdio>#include<cstring>#define oo 0x3f3f3f3fconst int maxn = 105;using namespace std;int map[maxn][maxn],vis[maxn][maxn],n,flag;int fx[] = {-1,1,0,0};int fy[] = {0,0,-1,1};int dfs(int x, int y, int ma,int mb){ if(x == n && y == n) { flag = 1; return 1; } for(int i = 0; i < 4 && !flag; i++) { int xi = x+fx[i]; int yi = y+fy[i]; if(xi>=1&&xi<=n&&yi>=1&&yi<=n&&!vis[xi][yi]) { if(map[xi][yi]>=ma && map[xi][yi]<=mb) { vis[xi][yi] = 1; if(dfs(xi,yi,ma,mb)) return 1; } } } return 0;}int main(){ int mn,mx,min1,max1,mid,ans; while(scanf("%d",&n)!=EOF) { mn = 130; mx = 0; for(int i = 1;i <= n; i++) { for(int j = 1; j <= n; j++) { scanf("%d",&map[i][j]); mn = mn<map[i][j]?mn:map[i][j]; mx = mx>map[i][j]?mx:map[i][j]; } } min1 = map[n][n]-map[1][1]; min1=min1>0?min1:-min1; max1 = mx-mn; while(min1 <= max1) { mid = (min1+max1)/2; flag = 0; for(int i = mn; i <=(mx-mid);i++) { memset(vis,0,sizeof(vis)); vis[1][1] = 1; if(i>map[1][1])break; if(i+mid < map[0][0])continue; if(dfs(1,1,i,i+mid)) { ans = mid; max1 = mid-1; break; } } if(!flag) { min1 = mid+1; } } printf("%d\n",ans); } return 0;}
0 0
- DFS+二分_NYOJ_306
- 二分搜索+DFS
- nyoj306 二分+dfs
- nyoj 306 二分+dfs
- hdu5536Chip Factory dfs+二分
- [二分+DFS]南蛮图腾
- HDU 5652 二分+DFS
- 二分图 【dfs】+【vector】
- [SCOI2005]栅栏 二分+dfs
- 二分匹配(dfs实现)+floyd
- 二分匹配DFS实现模板
- hdu 1045 dfs 二分匹配
- UVA10004Bicoloring(DFS)二分染色
- hdu 5652(二分加dfs)
- NOJ1053 恶魔城 dfs+二分求解
- Codeforces 740D dfs+二分
- 二分图判定 DFS版
- URAL 1156 Two Rounds (DFS二分染色 + DFS枚举 + 剪枝)
- 轻开平台(原WebEasy)字符串计算2---字符串组的比较
- Cordova 3.x 基础(7) -- Native API的使用
- 面经
- linux系统-进程管理-计划任务
- Linux 用户打开进程数的调整
- DFS+二分_NYOJ_306
- C++构造函数和析构函数异常
- 设计模式之单例模式
- # WinForm开发系列 - Form/Window
- C++运算符及其重载问题
- 水3_NYOJ_305
- C++异常处理的理解
- Act with Prudence
- 我转载的文章