#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e2 + 10;
vector< pair<int, int> >dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int a[N][N], vis[N][N];
int n;
void dfs(int x, int y, int z) { //从x,y开搜,走向没到过的、值<=z的点
if (a[x][y] > z || vis[n][n])
return ;
vis[x][y] = 1;
for (auto [i, j] : dir) {
int xx = x + i, yy = y + j;
if (xx < 1 || xx > n || yy < 1 || yy > n || vis[xx][yy])
continue;
dfs(xx, yy, z);
}
}
signed main() {
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
int low = 1, high = 1e9, mid, ans = 1e9;
while (low <= high) {
mid = (low + high) / 2;
memset(vis, 0, sizeof(vis));
dfs(1, 1, mid);//从起点往终点搜
if (vis[n][n]) {//vis[n][n]==1说明存在从起点到终点的路径,且路径的权值<=mid
ans = min(ans, mid);//取所有权值的最小
high = mid - 1;
} else
low = mid + 1;
}
cout << ans;
return 0;
}
7.16 / 24