O(n^3log(n))47MS水过,枚举高度差log(n),枚举最低高度n,dfs一遍n^2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 bool mark[105][105]; 6 int map[105][105]; 7 int n; 8 bool dfs(int x,int y,int mmin,int len) 9 { 10 mark[x][y]=true; 11 if(x==n&&y==n) 12 return true; 13 bool flag=false; 14 if(x<n&&!mark[x+1][y]&&map[x+1][y]<=mmin+len&&map[x+1][y]>=mmin) 15 flag|=dfs(x+1,y,mmin,len); 16 if(x>1&&!mark[x-1][y]&&map[x-1][y]<=mmin+len&&map[x-1][y]>=mmin) 17 flag|=dfs(x-1,y,mmin,len); 18 if(y>1&&!mark[x][y-1]&&map[x][y-1]<=mmin+len&&map[x][y-1]>=mmin) 19 flag|=dfs(x,y-1,mmin,len); 20 if(y<n&&!mark[x][y+1]&&map[x][y+1]<=mmin+len&&map[x][y+1]>=mmin) 21 flag|=dfs(x,y+1,mmin,len); 22 return flag; 23 } 24 bool solve(int mid) 25 { 26 int t=map[1][1]; 27 for(int i=max(t-mid,0);i<=t;i++) 28 { 29 memset(mark,false,sizeof(mark)); 30 if(dfs(1,1,i,mid)) 31 return true; 32 } 33 return false; 34 } 35 int main() 36 { 37 while(scanf("%d",&n)!=EOF) 38 { 39 for(int i=1;i<=n;i++) 40 for(int j=1;j<=n;j++) 41 scanf("%d",&map[i][j]); 42 int ans=0,ll,rr,mid; 43 for(ll=0,rr=110;ll<=rr;) 44 { 45 mid=(ll+rr)>>1; 46 if(solve(mid)) 47 { 48 ans=mid; 49 rr=mid-1; 50 } 51 else 52 { 53 ll=mid+1; 54 } 55 } 56 printf("%d\n",ans); 57 } 58 return 0; 59 }