#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
#include <unordered_set>
#include <random>
#ifdef _MSC_VER
# include <intrin.h>
# define __builtin_popcount __popcnt
#endif
//#include <atcoder/all>
//using namespace atcoder;
//typedef modint998244353 mint;
using namespace std;
typedef long long int lld;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<lld, lld> pll;
typedef vector<int> vi;
typedef vector<lld> vl;
typedef vector<ld> vld;
typedef vector<char> vch;
typedef vector<string> vs;
typedef vector<bool> vb;
typedef vector<double> vd;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<vi> vivi;
typedef vector<vl> vlvl;
typedef vector<vch> vcvc;
typedef vector<vb> vbvb;
typedef vector<vs> vsvs;
const lld mod = 1000000007LL;
const int inf = 1LL << 29;
const int nom = 1000000;
vivi moves = { {0, -1}, {-1, 0}, {1, 0}, {0, 1}};
bool isgo(int n, int x, int y)
{
return x >= 0 && x < n && y >= 0 && y < n;
}
int op(vivi &vc, int n, int k, int &mx)
{
int tp, tp2, tp3, tp4, tp5, tp6, tp7, ok = 0;
for (int i = 0; i < n; ++i)
{
if (k == 0)
tp = tp5 = i, tp2 = tp6 = 0;
else if (k == 1)
tp = tp5 = 0, tp2 = tp6 = i;
else if (k == 2)
tp = tp5 = n - 1, tp2 = tp6 = i;
else
tp = tp5 = i, tp2 = tp6 = n - 1;
while (1)
{
while (isgo(n, tp, tp2) && !vc[tp][tp2])
tp += moves[3 - k][0], tp2 += moves[3 - k][1];
if (!isgo(n, tp, tp2))
break;
if (k == 0)
tp3 = i, tp4 = tp2 + 1;
else if (k == 1)
tp3 = tp + 1, tp4 = i;
else if (k == 2)
tp3 = tp - 1, tp4 = i;
else
tp3 = i, tp4 = tp2 - 1;
while (isgo(n, tp3, tp4) && !vc[tp3][tp4])
tp3 += moves[3 - k][0], tp4 += moves[3 - k][1];
if (!isgo(n, tp3, tp4))
break;
if (vc[tp][tp2] == vc[tp3][tp4])
{
tp7 = vc[tp][tp2] * 2;
vc[tp][tp2] = vc[tp3][tp4] = 0;
vc[tp5][tp6] = tp7;
ok = 1;
mx = max(mx, vc[tp5][tp6]);
}
else
{
if (tp != tp5 || tp2 != tp6)
ok = 1;
tp7 = vc[tp][tp2];
vc[tp][tp2] = 0;
vc[tp5][tp6] = tp7;
mx = max(mx, vc[tp5][tp6]);
}
tp = tp3, tp2 = tp4;
tp5 += moves[3 - k][0], tp6 += moves[3 - k][1];
}
if (isgo(n, tp, tp2) && vc[tp][tp2])
{
if (tp != tp5 || tp2 != tp6)
ok = 1;
tp7 = vc[tp][tp2];
vc[tp][tp2] = 0;
vc[tp5][tp6] = tp7;
mx = max(mx, vc[tp5][tp6]);
}
}
return ok;
}
int go(vivi &vc, int n, int now, int last_dir, int initmx, int best)
{
int nowmx, tp, finmx = best;
vivi tmp;
if (now == 10)
return finmx;
for (int k = 0; k < 4; ++k)
{
nowmx = initmx;
tmp = vc;
tp = op(tmp, n, k, nowmx);
if (tp && (nowmx << (10 - (now + 1))) > finmx)
finmx = max(finmx, go(tmp, n, now + 1, k, nowmx, max(nowmx, finmx)));
}
return finmx;
}
int main()
{
cin.tie(NULL), cout.tie(NULL);
ios::sync_with_stdio(false);
int n, finmx, initmx = 0, nowmx;
cin >> n;
vivi vc(n, vi(n)), tmp;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> vc[i][j];
initmx = max(initmx, vc[i][j]);
}
}
finmx = initmx;
for (int k = 0; k < 4; ++k)
{
nowmx = initmx;
if ((nowmx << 10) > finmx)
finmx = max(finmx, go(vc, n, 0, k, nowmx, finmx));
}
cout << finmx;
cout << '\n';
return 0;
}
I2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiNpbmNsdWRlIDxyYW5kb20+CiNpZmRlZiBfTVNDX1ZFUgojCWluY2x1ZGUgPGludHJpbi5oPgojCWRlZmluZSBfX2J1aWx0aW5fcG9wY291bnQgX19wb3BjbnQKI2VuZGlmCgovLyNpbmNsdWRlIDxhdGNvZGVyL2FsbD4KLy91c2luZyBuYW1lc3BhY2UgYXRjb2RlcjsKLy90eXBlZGVmIG1vZGludDk5ODI0NDM1MyBtaW50OwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnR5cGVkZWYgbG9uZyBsb25nIGludCBsbGQ7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGxkLCBsbGQ+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiB2ZWN0b3I8bGxkPiB2bDsKdHlwZWRlZiB2ZWN0b3I8bGQ+IHZsZDsKdHlwZWRlZiB2ZWN0b3I8Y2hhcj4gdmNoOwp0eXBlZGVmIHZlY3RvcjxzdHJpbmc+IHZzOwp0eXBlZGVmIHZlY3Rvcjxib29sPiB2YjsKdHlwZWRlZiB2ZWN0b3I8ZG91YmxlPiB2ZDsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZwbGw7CnR5cGVkZWYgdmVjdG9yPHZpPiB2aXZpOwp0eXBlZGVmIHZlY3Rvcjx2bD4gdmx2bDsKdHlwZWRlZiB2ZWN0b3I8dmNoPiB2Y3ZjOwp0eXBlZGVmIHZlY3Rvcjx2Yj4gdmJ2YjsKdHlwZWRlZiB2ZWN0b3I8dnM+IHZzdnM7Cgpjb25zdCBsbGQgbW9kID0gMTAwMDAwMDAwN0xMOwpjb25zdCBpbnQgaW5mID0gMUxMIDw8IDI5Owpjb25zdCBpbnQgbm9tID0gMTAwMDAwMDsKCnZpdmkgbW92ZXMgPSB7IHswLCAtMX0sIHstMSwgMH0sIHsxLCAwfSwgezAsIDF9fTsKCmJvb2wgaXNnbyhpbnQgbiwgaW50IHgsIGludCB5KQp7CglyZXR1cm4geCA+PSAwICYmIHggPCBuICYmIHkgPj0gMCAmJiB5IDwgbjsKfQoKaW50IG9wKHZpdmkgJnZjLCBpbnQgbiwgaW50IGssIGludCAmbXgpCnsKCWludCB0cCwgdHAyLCB0cDMsIHRwNCwgdHA1LCB0cDYsIHRwNywgb2sgPSAwOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQoJewoJCWlmIChrID09IDApCgkJCXRwID0gdHA1ID0gaSwgdHAyID0gdHA2ID0gMDsKCQllbHNlIGlmIChrID09IDEpCgkJCXRwID0gdHA1ID0gMCwgdHAyID0gdHA2ID0gaTsKCQllbHNlIGlmIChrID09IDIpCgkJCXRwID0gdHA1ID0gbiAtIDEsIHRwMiA9IHRwNiA9IGk7CgkJZWxzZQoJCQl0cCA9IHRwNSA9IGksIHRwMiA9IHRwNiA9IG4gLSAxOwoKCQl3aGlsZSAoMSkKCQl7CgkJCXdoaWxlIChpc2dvKG4sIHRwLCB0cDIpICYmICF2Y1t0cF1bdHAyXSkKCQkJCXRwICs9IG1vdmVzWzMgLSBrXVswXSwgdHAyICs9IG1vdmVzWzMgLSBrXVsxXTsKCgkJCWlmICghaXNnbyhuLCB0cCwgdHAyKSkKCQkJCWJyZWFrOwoKCQkJaWYgKGsgPT0gMCkKCQkJCXRwMyA9IGksIHRwNCA9IHRwMiArIDE7CgkJCWVsc2UgaWYgKGsgPT0gMSkKCQkJCXRwMyA9IHRwICsgMSwgdHA0ID0gaTsKCQkJZWxzZSBpZiAoayA9PSAyKQoJCQkJdHAzID0gdHAgLSAxLCB0cDQgPSBpOwoJCQllbHNlCgkJCQl0cDMgPSBpLCB0cDQgPSB0cDIgLSAxOwoKCQkJd2hpbGUgKGlzZ28obiwgdHAzLCB0cDQpICYmICF2Y1t0cDNdW3RwNF0pCgkJCQl0cDMgKz0gbW92ZXNbMyAtIGtdWzBdLCB0cDQgKz0gbW92ZXNbMyAtIGtdWzFdOwoKCQkJaWYgKCFpc2dvKG4sIHRwMywgdHA0KSkKCQkJCWJyZWFrOwoKCQkJaWYgKHZjW3RwXVt0cDJdID09IHZjW3RwM11bdHA0XSkKCQkJewoJCQkJdHA3ID0gdmNbdHBdW3RwMl0gKiAyOwoJCQkJdmNbdHBdW3RwMl0gPSB2Y1t0cDNdW3RwNF0gPSAwOwoJCQkJdmNbdHA1XVt0cDZdID0gdHA3OwoKCQkJCW9rID0gMTsKCQkJCW14ID0gbWF4KG14LCB2Y1t0cDVdW3RwNl0pOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKHRwICE9IHRwNSB8fCB0cDIgIT0gdHA2KQoJCQkJCW9rID0gMTsKCgkJCQl0cDcgPSB2Y1t0cF1bdHAyXTsKCQkJCXZjW3RwXVt0cDJdID0gMDsKCQkJCXZjW3RwNV1bdHA2XSA9IHRwNzsKCgkJCQlteCA9IG1heChteCwgdmNbdHA1XVt0cDZdKTsKCQkJfQoKCQkJdHAgPSB0cDMsIHRwMiA9IHRwNDsKCQkJdHA1ICs9IG1vdmVzWzMgLSBrXVswXSwgdHA2ICs9IG1vdmVzWzMgLSBrXVsxXTsKCQl9CgoJCWlmIChpc2dvKG4sIHRwLCB0cDIpICYmIHZjW3RwXVt0cDJdKQoJCXsKCQkJaWYgKHRwICE9IHRwNSB8fCB0cDIgIT0gdHA2KQoJCQkJb2sgPSAxOwoKCQkJdHA3ID0gdmNbdHBdW3RwMl07CgkJCXZjW3RwXVt0cDJdID0gMDsKCQkJdmNbdHA1XVt0cDZdID0gdHA3OwoKCQkJbXggPSBtYXgobXgsIHZjW3RwNV1bdHA2XSk7CgkJfQoJfQoKCXJldHVybiBvazsKfQoKaW50IGdvKHZpdmkgJnZjLCBpbnQgbiwgaW50IG5vdywgaW50IGxhc3RfZGlyLCBpbnQgaW5pdG14LCBpbnQgYmVzdCkKewoJaW50IG5vd214LCB0cCwgZmlubXggPSBiZXN0OwoJdml2aSB0bXA7CgoJaWYgKG5vdyA9PSAxMCkKCQlyZXR1cm4gZmlubXg7CgoJZm9yIChpbnQgayA9IDA7IGsgPCA0OyArK2spCgl7CgkJbm93bXggPSBpbml0bXg7CgkJdG1wID0gdmM7CgkJdHAgPSBvcCh0bXAsIG4sIGssIG5vd214KTsKCgkJaWYgKHRwICYmIChub3dteCA8PCAoMTAgLSAobm93ICsgMSkpKSA+IGZpbm14KQoJCQlmaW5teCA9IG1heChmaW5teCwgZ28odG1wLCBuLCBub3cgKyAxLCBrLCBub3dteCwgbWF4KG5vd214LCBmaW5teCkpKTsKCX0KCglyZXR1cm4gZmlubXg7Cn0KCmludCBtYWluKCkKewoJY2luLnRpZShOVUxMKSwgY291dC50aWUoTlVMTCk7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgoJaW50IG4sIGZpbm14LCBpbml0bXggPSAwLCBub3dteDsKCgljaW4gPj4gbjsKCgl2aXZpIHZjKG4sIHZpKG4pKSwgdG1wOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQoJewoJCWZvciAoaW50IGogPSAwOyBqIDwgbjsgKytqKQoJCXsKCQkJY2luID4+IHZjW2ldW2pdOwoKCQkJaW5pdG14ID0gbWF4KGluaXRteCwgdmNbaV1bal0pOwoJCX0KCX0KCglmaW5teCA9IGluaXRteDsKCglmb3IgKGludCBrID0gMDsgayA8IDQ7ICsraykKCXsKCQlub3dteCA9IGluaXRteDsKCgkJaWYgKChub3dteCA8PCAxMCkgPiBmaW5teCkKCQkJZmlubXggPSBtYXgoZmlubXgsIGdvKHZjLCBuLCAwLCBrLCBub3dteCwgZmlubXgpKTsKCX0KCQoJY291dCA8PCBmaW5teDsKCgljb3V0IDw8ICdcbic7CgoJcmV0dXJuIDA7Cn0=