/*#include using namespace std; int n; int a[510][510]; int code[510][510]; map mp; set st; int fff[] = { 8,32,72,128,200,288,392,512 }; int dx[] = { -3, -2, -1, 1, 2, 3,-2,-1,0,1,2,-1,0,1,0,-2,-1,0,1,2,-1,0,1,0 }; int dy[] = { 0, 0, 0, 0, 0, 0,1,1,1,1,1,2,2,2,3,-1,-1,-1,-1,-1,-2,-2,-2,-3 }; void getQu(int x, int y) { vector ve; for (int i = 0; i < 24; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || nx >= n || ny < 0 || ny >= n) continue; ve.push_back(a[nx][ny]); } sort(ve.begin(), ve.end(), greater()); code[x][y] = a[x][y] - 1; for (int i = 0; i < 7; i++) code[x][y] = code[x][y] * 3 + ve[i] - 1; if (!mp[code[x][y]]) { int speed = a[x][y], index = 0, now = 0; while (index < 8) { int t = (fff[index] - now) / speed + ((fff[index] - now) % speed != 0); now += t * speed, mp[code[x][y]] += t; if (index == 7) break; while (index < 8 && now >= fff[index]) { if (index < ve.size()) speed += ve[index]; index++; } } } } int main() { int T; scanf("%d", &T); while (T--) { int x, y; scanf("%d%d%d", &n, &x, &y); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) scanf("%d", &a[i][j]); for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) getQu(i, j); int ret = 0x3f3f3f3f; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { int dis = abs(i - x) + abs(j - y); ret = min(ret, (dis + 1) / 2 + mp[code[i][j]]); } cout << ret << endl; } return 0; }*/ #include using namespace std; #define FOR(i, a, b) for(int i = a; i <= b; i++) int n; int a[1005][1005]; int solve(int x, int y) { vector array; FOR(i, 1, 3) { FOR(j, 1, 3 - i) { if (x + i <= n && y + j <= n) array.push_back(a[x + i][y + j]); if (x + i <= n && y - j >= 1) array.push_back(a[x + i][y - j]); if (x - i >= 1 && y + j <= n) array.push_back(a[x - i][y + j]); if (x - i >= 1 && y - j >= 1) array.push_back(a[x - i][y - j]); } } FOR(i, 1, 3) { if (y + i <= n) array.push_back(a[x][y + i]); if (y - i >= 1) array.push_back(a[x][y - i]); if (x + i <= n) array.push_back(a[x + i][y]); if (x - i >= 1) array.push_back(a[x - i][y]); } sort(array.begin(), array.end(), greater()); int ans; int now = 0, speed = a[x][y]; if (array.size() < 8) { for (int i = 1; i - 1 < array.size(); i++) { ans = (i*i * 8 + now) / speed + ((i*i * 8 + now) % speed != 0); now += array[i - 1] * ans; speed += array[i - 1]; } ans = ((512 + now) / speed) + ((512 + now) % speed != 0); } else { FOR(i, 1, 8) { ans = (i*i * 8 + now) / speed + ((i*i * 8 + now) % speed != 0); now += array[i - 1] * ans; speed += array[i - 1]; } } return ans; } int main() { int T; scanf("%d", &T); while (T--) { int x, y; scanf("%d%d%d", &n, &x, &y); for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) scanf("%d", &a[i][j]); int ans = 0x3f3f3f3f; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { int dis = abs(i - x) + abs(j - y); ans = min(ans, (dis + 1) / 2 + solve(i, j)); } } printf("%d\n", ans); } }