#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;

}

最新文章

  1. Innodb行锁源码学习(一)
  2. BOM(Bill of Material)详解
  3. SQL Server 2008下日志清理方法
  4. CSS3 div水平、垂直居中,IE9以上、Firefox、Chrome均正常
  5. Android发送通知栏通知
  6. 在windows下安装pip scrapy...
  7. linux的文件权限与目录配置&lt;-----&gt;第二章
  8. DNS:域名系统
  9. Ubuntu下sudo命令出现无法解析主机名
  10. java的hashmap与hashtable说明,简单易理解
  11. K8s的调度策略
  12. Centos 6.x 升级到 7.x
  13. MI200e电力线通讯
  14. sublime 将打字内容放在屏幕中央
  15. [SDOI2016]游戏 树剖+李超树
  16. easyui的DataGrid的单元格添加ProgressBar进度条
  17. MAC配置Xcode的Cocos2d-x环境
  18. easyui-combo个人实例
  19. Android LCD(二):LCD常用接口原理篇(转)
  20. 20170728xlVba还是这个混蛋

热门文章

  1. [算法基础]斐波那契(recursion+loop)两种方式执行时间对比
  2. bzoj4872
  3. la3713
  4. [Apple开发者帐户帮助]七、注册设备(2)注册多个设备
  5. vagrant使用centos的环境安装..
  6. Git学习之序
  7. 【HTML5】基于HTML5的高性能动画与游戏
  8. Codeforces 769C
  9. flask 初始
  10. Android 显示意图和隐式意图的区别