#include #include int st[105][105]; int vi[105][105]; int ans; int max,min; int n,fla; int fx[]={0,0,1,-1}; int fy[]={1,-1,0,0}; void dfs(int x,int y,int ma,int min) { // printf("%d %dxyxy\n",x,y); if(fla) return; if(x==n-1&&y==n-1) { fla=1; // printf("%d %dff\n",ma,min); return; } for(int i=0;i<4;i++) { // printf("%d %d fx\n",fx[i],fy[i]); int xx=x+fx[i]; int yy=y+fy[i]; // printf("%d %d xxyy\n",xx,yy); if(st[xx][yy]>=min&&st[xx][yy]<=ma&&!vi[xx][yy]&&xx>=0&&yy>=0) { vi[xx][yy]=1; dfs(xx,yy,ma,min); //vi[xx][yy]=0; 此处 } } } int find(int mm) { for(int i=min;i<=max-mm;i++) { if(st[0][0]<i||st[0][0]>i+mm) continue; if(st[n-1][n-1]<i||st[n-1][n-1]>i+mm) continue; fla=0; memset(vi,0,sizeof(vi)); vi[0][0]=1; dfs(0,0,i+mm,i); if(fla) return 1; } return 0; } int main() { while(~scanf("%d",&n)) { memset(st,-1,sizeof(st)); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { int a; scanf("%d",&a); if(a>max) max=a; if(a<min) min=a; st[i][j]=a; } int jw=max-min; int ks=0,mid; while(jw>ks) { // printf("%dmid\n",mid); mid=(jw+ks)/2; int fl=find(mid); if(fl) jw=mid; else ks=mid+1; } printf("%d\n",jw); } }