#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
template<typename T>
void maximize(T& a, const T& b) {
if (a < b) a = b;
}
template<typename T>
void minimize(T& a, const T& b) {
if (b < a) a = b;
}
const ll LINF = 1e18;
const int INF = 1e9;
const int N = 2e3 + 5;
int dx[8] = {0, 0, -1, 1, -1, -1, 1, 1};
int dy[8] = {-1, 1, 0, 0, -1, 1, -1, 1};
int n;
int a[N][N];
// Ô (x, y) thuộc 1 trong 5 loại:
// 0: Ô thuộc hàng 1
// 1: Ô thuộc cột n
// 2: Ô thuộc hàng n
// 3: Ô thuộc cột 1
// 4: Trường hợp còn lại
int getIndex(int x, int y) {
if (x == 1) return 0;
if (y == n) return 1;
if (x == n) return 2;
if (y == 1) return 3;
return 4;
}
struct Node {
int id; // (0 <= id <= 1) là loại của ô xuất phát
int x, y; // toạ độ của ô đang xét
};
bool vis[2][N][N];
bool marked[2][5];
bool ok(int x, int y) {
return (1 <= x && x <= n && 1 <= y && y <= n);
}
// Có tồn tại đường đi nào từ ô (1, 1) đến ô (n, n) sao cho không được đi qua ô nào có giá trị = val
// Tương đương với check các ô có giá trị = val có tạo thành đường đi rơi vào
// 1 trong 4 trường hợp:
// TH1: xuất phát tại một ô hàng 1 và đi đến một ô hàng n
// TH2: xuất phát tại một ô hàng 1 và đi đến một ô cột 1
// TH3: xuất phát tại một ô cột n và đi đến một ô hàng n
// TH4: xuất phát tại một ô cột n và đi đến một ô cột 1
// mỗi bước được đi 8 hướng
bool bfs(int val) {
if (a[1][1] == val || a[n][n] == val) return false;
memset(marked, 0, sizeof marked);
for (int id = 0; id < 2; id++) {
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) vis[id][x][y] = false;
}
}
queue<Node> q;
// Xét các ô có giá trị val ở hàng 1
for (int y = 1; y <= n; y++) {
if (a[1][y] == val) {
vis[0][1][y] = true;
q.push({0, 1, y});
}
}
// Xét các ô có giá trị val ở cột n
for (int x = 1; x <= n; x++) {
if (a[x][n] == val) {
vis[1][x][n] = true;
q.push({1, x, n});
}
}
while (!q.empty()) {
Node u = q.front(); q.pop();
int id = u.id, x = u.x, y = u.y;
for (int i = 0; i < 8; i++) {
int nx = x + dx[i], ny = y + dy[i];
if (!ok(nx, ny)) continue;
if (a[nx][ny] == val && !vis[id][nx][ny]) {
vis[id][nx][ny] = true;
marked[id][getIndex(nx, ny)] = true;
q.push({id, nx, ny});
}
}
}
return (!marked[0][2] && !marked[0][3] && !marked[1][2] && !marked[1][3]);
}
bool check(int val) {
return bfs(val);
}
void solve() {
cin >> n;
for (int x = 1; x <= n; x++) {
for (int y = 1; y <= n; y++) cin >> a[x][y];
}
int mex = -1;
for (int val = 1; val <= n * n + 1; val++) {
if (check(val)) {
mex = val;
break;
}
}
cout << mex << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
solve();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGFsbCh4KSAoeCkuYmVnaW4oKSwgKHgpLmVuZCgpCiNkZWZpbmUgcmFsbCh4KSAoeCkucmJlZ2luKCksICh4KS5yZW5kKCkKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKdHlwZWRlZiBsb25nIGxvbmcgbGw7IAp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOyAKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgbWF4aW1pemUoVCYgYSwgY29uc3QgVCYgYikgewoJaWYgKGEgPCBiKSBhID0gYjsgIAp9Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIG1pbmltaXplKFQmIGEsIGNvbnN0IFQmIGIpIHsKCWlmIChiIDwgYSkgYSA9IGI7IAp9Cgpjb25zdCBsbCBMSU5GID0gMWUxODsgCmNvbnN0IGludCBJTkYgPSAxZTk7Cgpjb25zdCBpbnQgTiA9IDJlMyArIDU7IAoKaW50IGR4WzhdID0gezAsIDAsIC0xLCAxLCAtMSwgLTEsIDEsIDF9OyAKaW50IGR5WzhdID0gey0xLCAxLCAwLCAwLCAtMSwgMSwgLTEsIDF9OyAgCgppbnQgbjsgIAppbnQgYVtOXVtOXTsgCgovLyDDlCAoeCwgeSkgdGh14buZYyAxIHRyb25nIDUgbG/huqFpOiAKLy8gMDogw5QgdGh14buZYyBow6BuZyAxCi8vIDE6IMOUIHRodeG7mWMgY+G7mXQgbiAKLy8gMjogw5QgdGh14buZYyBow6BuZyBuCi8vIDM6IMOUIHRodeG7mWMgY+G7mXQgMQovLyA0OiBUcsaw4budbmcgaOG7o3AgY8OybiBs4bqhaQppbnQgZ2V0SW5kZXgoaW50IHgsIGludCB5KSB7CglpZiAoeCA9PSAxKSByZXR1cm4gMDsgIAoJaWYgKHkgPT0gbikgcmV0dXJuIDE7IAoJaWYgKHggPT0gbikgcmV0dXJuIDI7ICAKCWlmICh5ID09IDEpIHJldHVybiAzOyAKCXJldHVybiA0OyAKfQoKc3RydWN0IE5vZGUgewoJaW50IGlkOyAvLyAoMCA8PSBpZCA8PSAxKSBsw6AgbG/huqFpIGPhu6dhIMO0IHh14bqldCBwaMOhdAkKCWludCB4LCB5OyAvLyB0b+G6oSDEkeG7mSBj4bunYSDDtCDEkWFuZyB4w6l0Cn07IAoKYm9vbCB2aXNbMl1bTl1bTl07ICAKYm9vbCBtYXJrZWRbMl1bNV07Cgpib29sIG9rKGludCB4LCBpbnQgeSkgewoJcmV0dXJuICgxIDw9IHggJiYgeCA8PSBuICYmIDEgPD0geSAmJiB5IDw9IG4pOyAgCn0KCi8vIEPDsyB04buTbiB04bqhaSDEkcaw4budbmcgxJFpIG7DoG8gdOG7qyDDtCAoMSwgMSkgxJHhur9uIMO0IChuLCBuKSBzYW8gY2hvIGtow7RuZyDEkcaw4bujYyDEkWkgcXVhIMO0IG7DoG8gY8OzIGdpw6EgdHLhu4sgPSB2YWwKLy8gVMawxqFuZyDEkcawxqFuZyB24bubaSBjaGVjayBjw6FjIMO0IGPDsyBnacOhIHRy4buLID0gdmFsIGPDsyB04bqhbyB0aMOgbmggxJHGsOG7nW5nIMSRaSByxqFpIHbDoG8KLy8gMSB0cm9uZyA0IHRyxrDhu51uZyBo4bujcDoKLy8gVEgxOiB4deG6pXQgcGjDoXQgdOG6oWkgbeG7mXQgw7QgaMOgbmcgMSB2w6AgxJFpIMSR4bq/biBt4buZdCDDtCBow6BuZyBuCi8vIFRIMjogeHXhuqV0IHBow6F0IHThuqFpIG3hu5l0IMO0IGjDoG5nIDEgdsOgIMSRaSDEkeG6v24gbeG7mXQgw7QgY+G7mXQgMQovLyBUSDM6IHh14bqldCBwaMOhdCB04bqhaSBt4buZdCDDtCBj4buZdCBuIHbDoCDEkWkgxJHhur9uIG3hu5l0IMO0IGjDoG5nIG4KLy8gVEg0OiB4deG6pXQgcGjDoXQgdOG6oWkgbeG7mXQgw7QgY+G7mXQgbiB2w6AgxJFpIMSR4bq/biBt4buZdCDDtCBj4buZdCAxCi8vIG3hu5dpIGLGsOG7m2MgxJHGsOG7o2MgxJFpIDggaMaw4bubbmcgCmJvb2wgYmZzKGludCB2YWwpIHsKCWlmIChhWzFdWzFdID09IHZhbCB8fCBhW25dW25dID09IHZhbCkgcmV0dXJuIGZhbHNlOyAgIAoKCW1lbXNldChtYXJrZWQsIDAsIHNpemVvZiBtYXJrZWQpOyAgCgoJZm9yIChpbnQgaWQgPSAwOyBpZCA8IDI7IGlkKyspIHsKCQlmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKCQkJZm9yIChpbnQgeSA9IDE7IHkgPD0gbjsgeSsrKSB2aXNbaWRdW3hdW3ldID0gZmFsc2U7IAoJCX0KCX0KCQoJcXVldWU8Tm9kZT4gcTsgCgoJLy8gWMOpdCBjw6FjIMO0IGPDsyBnacOhIHRy4buLIHZhbCDhu58gaMOgbmcgMSAgCglmb3IgKGludCB5ID0gMTsgeSA8PSBuOyB5KyspIHsKCQlpZiAoYVsxXVt5XSA9PSB2YWwpIHsKCQkJdmlzWzBdWzFdW3ldID0gdHJ1ZTsgCgkJCXEucHVzaCh7MCwgMSwgeX0pOyAKCQl9Cgl9CgoJLy8gWMOpdCBjw6FjIMO0IGPDsyBnacOhIHRy4buLIHZhbCDhu58gY+G7mXQgbgoJZm9yIChpbnQgeCA9IDE7IHggPD0gbjsgeCsrKSB7CgkJaWYgKGFbeF1bbl0gPT0gdmFsKSB7CgkJCXZpc1sxXVt4XVtuXSA9IHRydWU7IAoJCQlxLnB1c2goezEsIHgsIG59KTsgCgkJfQoJfQoKCXdoaWxlICghcS5lbXB0eSgpKSB7CgkJTm9kZSB1ID0gcS5mcm9udCgpOyBxLnBvcCgpOyAKCQlpbnQgaWQgPSB1LmlkLCB4ID0gdS54LCB5ID0gdS55OyAgIAoKCQlmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewoJCQlpbnQgbnggPSB4ICsgZHhbaV0sIG55ID0geSArIGR5W2ldOwoJCQkKCQkJaWYgKCFvayhueCwgbnkpKSBjb250aW51ZTsgCgoJCQlpZiAoYVtueF1bbnldID09IHZhbCAmJiAhdmlzW2lkXVtueF1bbnldKSB7CgkJCQl2aXNbaWRdW254XVtueV0gPSB0cnVlOyAKCQkJCW1hcmtlZFtpZF1bZ2V0SW5kZXgobngsIG55KV0gPSB0cnVlOyAgCgkJCQlxLnB1c2goe2lkLCBueCwgbnl9KTsgIAoJCQl9CgkJfQoJfQoKCXJldHVybiAoIW1hcmtlZFswXVsyXSAmJiAhbWFya2VkWzBdWzNdICYmICFtYXJrZWRbMV1bMl0gJiYgIW1hcmtlZFsxXVszXSk7IAp9Cgpib29sIGNoZWNrKGludCB2YWwpIHsKCXJldHVybiBiZnModmFsKTsgIAkKfQoKdm9pZCBzb2x2ZSgpIHsKCWNpbiA+PiBuOyAKCglmb3IgKGludCB4ID0gMTsgeCA8PSBuOyB4KyspIHsKCQlmb3IgKGludCB5ID0gMTsgeSA8PSBuOyB5KyspIGNpbiA+PiBhW3hdW3ldOwoJfQoKCWludCBtZXggPSAtMTsgCglmb3IgKGludCB2YWwgPSAxOyB2YWwgPD0gbiAqIG4gKyAxOyB2YWwrKykgewoJCWlmIChjaGVjayh2YWwpKSB7CgkJCW1leCA9IHZhbDsgICAKCQkJYnJlYWs7IAoJCX0KCX0KCgljb3V0IDw8IG1leCA8PCAnXG4nOyAKfQoKc2lnbmVkIG1haW4oKSB7Cglpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCglpbnQgdHQ7IAoJY2luID4+IHR0OyAKCXdoaWxlICh0dC0tKSB7CgkJc29sdmUoKTsgCgl9Cn0K