#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
#define ii pair<int, int>
#define fi first
#define se second
using namespace std;
const int maxn = 1e3;
const int base = maxn + 1;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
int n, leader[base *base + 10], sz[base * base + 10], ans = 0;
ll a[maxn + 10][maxn + 10];
vector<ll> v;
map<int, vector<ii>> mp;
vector<ii> edge[base * base + 10];
bool in_matrix(int x, int y)
{
return x >= 1 && x <= n && y >= 1 && y <= n;
}
int get_node_id(int x, int y)
{
return (x - 1) * n + y;
}
int get_id(int x)
{
return lower_bound(v.begin(), v.end(), x) - v.begin();
}
int find_leader(int x)
{
if (x == leader[x]) return x;
return leader[x] = find_leader(leader[x]);
}
void connect(int x, int y)
{
x = find_leader(x);
y = find_leader(y);
if (x == y) return ;
if (sz[x] < sz[y]) swap(x, y);
sz[x] += sz[y];
leader[y] = x;
ans = max(ans, sz[x]);
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("ROBOT.INP", "r"))
{
freopen("ROBOT.INP", "r", stdin);
freopen("ROBOT.OUT", "w", stdout);
}
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 1; i <= get_node_id(n, n); i++)
{
leader[i] = i;
sz[i] = 1;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int k = 0; k < 4; k++)
{
int ni = i + dx[k];
int nj = j + dy[k];
if (!in_matrix(ni, nj)) continue;
v.push_back(abs(a[i][j] - a[ni][nj]));
}
}
}
sort(v.begin(), v.end());
v.resize(unique(v.begin(), v.end()) - v.begin());
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
for (int k = 0; k < 4; k++)
{
int ni = i + dx[k];
int nj = j + dy[k];
if (!in_matrix(ni, nj)) continue;
edge[get_id(abs(a[i][j] - a[ni][nj]))].push_back({get_node_id(i, j), get_node_id(ni, nj)});
}
}
}
for (int i = 0; i < v.size(); i++)
{
for (ii p : edge[i])
{
int a = p.fi;
int b = p.se;
connect(a, b);
}
for (ii p : edge[i])
{
int a = p.fi;
int b = p.se;
leader[a] = a;
leader[b] = b;
sz[a] = sz[b] = 1;
}
}
cout << ans;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LCBpbnQ+CiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpjb25zdCBpbnQgbWF4biA9IDFlMzsKY29uc3QgaW50IGJhc2UgPSBtYXhuICsgMTsKY29uc3QgaW50IGR4W10gPSB7LTEsIDAsIDEsIDB9Owpjb25zdCBpbnQgZHlbXSA9IHswLCAxLCAwLCAtMX07CgppbnQgbiwgbGVhZGVyW2Jhc2UgKmJhc2UgKyAxMF0sIHN6W2Jhc2UgKiBiYXNlICsgMTBdLCBhbnMgPSAwOwpsbCBhW21heG4gKyAxMF1bbWF4biArIDEwXTsKdmVjdG9yPGxsPiB2OwptYXA8aW50LCB2ZWN0b3I8aWk+PiBtcDsKdmVjdG9yPGlpPiBlZGdlW2Jhc2UgKiBiYXNlICsgMTBdOwoKYm9vbCBpbl9tYXRyaXgoaW50IHgsIGludCB5KQp7CiAgICByZXR1cm4geCA+PSAxICYmIHggPD0gbiAmJiB5ID49IDEgJiYgeSA8PSBuOwp9CmludCBnZXRfbm9kZV9pZChpbnQgeCwgaW50IHkpCnsKICAgIHJldHVybiAoeCAtIDEpICogbiArIHk7Cn0KaW50IGdldF9pZChpbnQgeCkKewogICAgcmV0dXJuIGxvd2VyX2JvdW5kKHYuYmVnaW4oKSwgdi5lbmQoKSwgeCkgLSB2LmJlZ2luKCk7Cn0KaW50IGZpbmRfbGVhZGVyKGludCB4KQp7CiAgICBpZiAoeCA9PSBsZWFkZXJbeF0pIHJldHVybiB4OwogICAgcmV0dXJuIGxlYWRlclt4XSA9IGZpbmRfbGVhZGVyKGxlYWRlclt4XSk7Cn0Kdm9pZCBjb25uZWN0KGludCB4LCBpbnQgeSkKewogICAgeCA9IGZpbmRfbGVhZGVyKHgpOwogICAgeSA9IGZpbmRfbGVhZGVyKHkpOwogICAgaWYgKHggPT0geSkgcmV0dXJuIDsKICAgIGlmIChzelt4XSA8IHN6W3ldKSBzd2FwKHgsIHkpOwogICAgc3pbeF0gKz0gc3pbeV07CiAgICBsZWFkZXJbeV0gPSB4OwogICAgYW5zID0gbWF4KGFucywgc3pbeF0pOwp9CgppbnQgbWFpbigpCnsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7IGNpbi50aWUoMCk7IGNvdXQudGllKDApOwogICAgaWYgKGZvcGVuKCJST0JPVC5JTlAiLCAiciIpKQogICAgewogICAgICAgIGZyZW9wZW4oIlJPQk9ULklOUCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIlJPQk9ULk9VVCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KCiAgICBjaW4gPj4gbjsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspCiAgICAgICAgICAgIGNpbiA+PiBhW2ldW2pdOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gZ2V0X25vZGVfaWQobiwgbik7IGkrKykKICAgIHsKICAgICAgICBsZWFkZXJbaV0gPSBpOwogICAgICAgIHN6W2ldID0gMTsKICAgIH0KICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IG5pID0gaSArIGR4W2tdOwogICAgICAgICAgICAgICAgaW50IG5qID0gaiArIGR5W2tdOwogICAgICAgICAgICAgICAgaWYgKCFpbl9tYXRyaXgobmksIG5qKSkgY29udGludWU7CiAgICAgICAgICAgICAgICB2LnB1c2hfYmFjayhhYnMoYVtpXVtqXSAtIGFbbmldW25qXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgc29ydCh2LmJlZ2luKCksIHYuZW5kKCkpOwogICAgdi5yZXNpemUodW5pcXVlKHYuYmVnaW4oKSwgdi5lbmQoKSkgLSB2LmJlZ2luKCkpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IG47IGorKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpbnQgbmkgPSBpICsgZHhba107CiAgICAgICAgICAgICAgICBpbnQgbmogPSBqICsgZHlba107CiAgICAgICAgICAgICAgICBpZiAoIWluX21hdHJpeChuaSwgbmopKSBjb250aW51ZTsKICAgICAgICAgICAgICAgIGVkZ2VbZ2V0X2lkKGFicyhhW2ldW2pdIC0gYVtuaV1bbmpdKSldLnB1c2hfYmFjayh7Z2V0X25vZGVfaWQoaSwgaiksIGdldF9ub2RlX2lkKG5pLCBuail9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBmb3IgKGlpIHAgOiBlZGdlW2ldKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGEgPSBwLmZpOwogICAgICAgICAgICBpbnQgYiA9IHAuc2U7CiAgICAgICAgICAgIGNvbm5lY3QoYSwgYik7CiAgICAgICAgfQogICAgICAgIGZvciAoaWkgcCA6IGVkZ2VbaV0pCiAgICAgICAgewogICAgICAgICAgICBpbnQgYSA9IHAuZmk7CiAgICAgICAgICAgIGludCBiID0gcC5zZTsKICAgICAgICAgICAgbGVhZGVyW2FdID0gYTsKICAgICAgICAgICAgbGVhZGVyW2JdID0gYjsKICAgICAgICAgICAgc3pbYV0gPSBzeltiXSA9IDE7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCBhbnM7Cn0=