nyoj 306 二分+dfs
来源:互联网 发布:vnc server windows 编辑:程序博客网 时间:2024/05/01 20:41
#include<stdio.h>
#include<string.h>
#define N 200
int Min(int a,int b) {
return a>b?b:a;
}
int Max(int a,int b) {
return a>b?a:b;
}
int map[N][N],flag,visit[N][N],n,min,max;
int dis[4][2]={1,0,-1,0,0,1,0,-1};
void init() {
int i,j;
min=1000;
max=-1000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
scanf("%d",&map[i][j]);
min=Min(min,map[i][j]);
max=Max(max,map[i][j]);
}
}
void dfs(int x,int y,int min,int max){
if(flag)return ;
if(x==n&&y==n){flag=1;return ;}
int i;
for(i=0;i<4;i++) {
int xx=x+dis[i][0];
int yy=y+dis[i][1];
if(map[xx][yy]>=min&&map[xx][yy]<=max&&visit[xx][yy]==0&&xx>=1&&xx<=n&&yy>=1&&yy<=n) {
visit[xx][yy]=1;
dfs(xx,yy,min,max);
}
}
}
int find_answer(int k) {
int i;
for(i=min;i<=max-k;i++) {
if(map[1][1]<i||map[1][1]>i+k)continue;
if(map[n][n]<i||map[n][n]>i+k)continue;
memset(visit,0,sizeof(visit));
visit[1][1]=1;
flag=0;
dfs(1,1,i,i+k);
if(flag==1)return 1;
}
return 0;
}
int slove(){
int mid,x=0,y=max-min;
while(x<y) {
mid=(x+y)/2;
if(find_answer(mid))
y=mid;
else
x=mid+1;
}
return y;
}
int main() {
while(scanf("%d",&n)!=EOF) {
init();
printf("%d\n",slove());
}
return 0;
}
#include<string.h>
#define N 200
int Min(int a,int b) {
return a>b?b:a;
}
int Max(int a,int b) {
return a>b?a:b;
}
int map[N][N],flag,visit[N][N],n,min,max;
int dis[4][2]={1,0,-1,0,0,1,0,-1};
void init() {
int i,j;
min=1000;
max=-1000;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) {
scanf("%d",&map[i][j]);
min=Min(min,map[i][j]);
max=Max(max,map[i][j]);
}
}
void dfs(int x,int y,int min,int max){
if(flag)return ;
if(x==n&&y==n){flag=1;return ;}
int i;
for(i=0;i<4;i++) {
int xx=x+dis[i][0];
int yy=y+dis[i][1];
if(map[xx][yy]>=min&&map[xx][yy]<=max&&visit[xx][yy]==0&&xx>=1&&xx<=n&&yy>=1&&yy<=n) {
visit[xx][yy]=1;
dfs(xx,yy,min,max);
}
}
}
int find_answer(int k) {
int i;
for(i=min;i<=max-k;i++) {
if(map[1][1]<i||map[1][1]>i+k)continue;
if(map[n][n]<i||map[n][n]>i+k)continue;
memset(visit,0,sizeof(visit));
visit[1][1]=1;
flag=0;
dfs(1,1,i,i+k);
if(flag==1)return 1;
}
return 0;
}
int slove(){
int mid,x=0,y=max-min;
while(x<y) {
mid=(x+y)/2;
if(find_answer(mid))
y=mid;
else
x=mid+1;
}
return y;
}
int main() {
while(scanf("%d",&n)!=EOF) {
init();
printf("%d\n",slove());
}
return 0;
}
0 0
- nyoj 306 二分+dfs
- nyoj 306 4th河南省赛 走迷宫【dfs】【二分】
- NYOJ-306走迷宫(二分查找+DFS)
- nyoj 306 搜索+二分
- [DFS] NYOJ
- nyoj-306-走迷宫--二分法+dfs
- nyoj-306-走迷宫【dfs】【好题】
- NYOJ 306 走迷宫(DFS+二分法)
- NYOJ 306 走迷宫 【二分+搜索】
- NYOJ 488 dfs
- 素数环 NYOJ dfs
- NYOJ - 水池数目(DFS)
- nyoj-325 dfs
- nyoj-20(dfs)
- NYOJ 587 blockhouses 【DFS】
- NYOJ 587 blockhouses 【dfs】
- nyoj 587 blockhouses 【DFS】
- nyoj 水池数目(dfs)
- MT7620A usb挂载问题解决
- 【转】在MFC程序中调用或打开其他文件方式
- Qt学习之路(21): event()
- 加载laptop Aspire one (acer) 的wifi内核模块
- mysql数据库转换编码
- nyoj 306 二分+dfs
- 关于 Demo_DeferedShading 例子的分析
- 大学生活
- Qt学习之路(22): 事件过滤器
- mac上php+nginx配置
- ligerui V1.2.3中去掉了实体绑定获取全部问题!
- 将Ogre写入MFC框架中
- EOJ 1855 Solution Report - Expedition
- 如何检测内存泄露