二分搜索答案。
代码里面有注释。

#include<bits/stdc++.h>
using namespace std;
int dir[4][2]= {{1, 0}, {0, 1}, {0, -1},{-1, 0}};
int n;
int vis[110][110], a[110][110];

// 防止越界、或者重复访问 
bool check(int x, int y){
    if(x < 1 || x > n){
        return false;
    }
    if(y < 1 || y > n){
        return false;
    }
    if(vis[x][y]){
        return false;
    }

    return true;
}

void dfs(int x, int y, int minn, int maxn){
    // 四个方向硬搜 
    for(int i = 0; i < 4; i++) {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];

        // 搜索的值都在minn 和 maxn之内 
        if(check(xx,yy) && a[xx][yy] >= minn && a[xx][yy] <= maxn) {
            vis[xx][yy] = 1;
            dfs(xx, yy, minn, maxn);
        }
    }
}



int main(){
    cin>>n;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            cin>>a[i][j];
        }
    }
    // 二分遍历答案 
    int l = 0, r = 3000, res = 3000;
    while(l <= r){
        int mid = (l + r) >> 1;
        int f = 0;
        // 遍历minn 和 maxn
        // maxn - minn = mid
        for(int i = 0; i < 3000 - mid; i++){
            if(a[1][1] < i || a[1][1] > i + mid)    continue;
            memset(vis, 0, sizeof(vis));
            vis[1][1] = 1;
            // 起始点, 最小值, 最大值 
            dfs(1, 1, i, i + mid);

            // 如果能够到达终点 
            if(vis[n][n]){
                f = 1;
                break;
            }
        }
        if(f){
            res = mid;
            r = mid - 1;
        }
        else{
            l = mid + 1;

        }
    }

    cout<<res;


    return 0;
}