https://www.luogu.com.cn/problem/P1123
// Problem:
// P1123 取数游戏
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1123
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
using namespace std;
const int N = 50;
int dx[] = {2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2, -2, -2, 0, 1};
int dy[] = {-2, -1, 0, 1, 2, 2, 2, 2, 2, 1, 0, -1, -2, -2, -2, -2};
int vis[N][N];
void work() {
int n, m, maxn = -1;
int a[N][N];
memset(vis, 0, sizeof vis);
cin >> n >> m;
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
cin >> a[i][j];
}
}
for (int i=1;i<=n+1;i++) {
for (int j=1;j<=m+1;j++) {
if (vis[i][j] == 0) {
int cnt = 0;
queue <pair<int, int> > q;
q.push({i, j});
vis[i][j] = 1;
while (q.size()) {
pair<int, int> u = q.front();
q.pop();
for (int k=0;k<16;k++) {
int nx = u.first + dx[k];
int ny = u.second + dy[k];
if (nx<=0||ny<=0||nx>n+3||ny>m+3) continue;
if (vis[nx][ny] == 0) {
vis[nx][ny] = 1;
cnt+=a[nx][ny];
q.push({nx, ny});
}
}
}
maxn = max(maxn, cnt);
}
}
}
cout << maxn << endl;
}
int main () {
int t;
cin >> t;
while (t--) {
work();
}
return 0;
}