// import java.util.Scanner;
// // 注意类名必须为 Main, 不要有任何 package xxx 信息
// public class Main {
// public static void main(String[] args) {
// Scanner in = new Scanner(System.in);
// // 注意 hasNext 和 hasNextLine 的区别
// // while (in.hasNextInt()) { // 注意 while 处理多个 case
// // int a = in.nextInt();
// // int b = in.nextInt();
// // System.out.println(a + b);
// // } 21:42
// // 1. 取出若干个数字
// // 2. 取出若干个数字
// }
// }
import java.util.Scanner;
public class Main {
static int N, M;
static int maxResult;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt(); // 测试用例数量
while (T-- > 0) {
N = scanner.nextInt(); // 矩阵行数
M = scanner.nextInt(); // 矩阵列数
int[][] matrix = new int[N][M]; // 存储数字矩阵
int[][] used = new int[N][M]; // 标记矩阵(0=未选,1=已选)
// 读取矩阵数据
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
matrix[i][j] = scanner.nextInt();
}
}
maxResult = 0; // 初始化最大和为0
solve(matrix, used, 0, 0, 0); // 从(0,0)开始搜索
System.out.println(maxResult);
}
scanner.close();
}
/**
* DFS搜索所有可能的选取方案
* @param matrix 数字矩阵
* @param used 标记矩阵(记录已选位置)
* @param x 当前处理的行坐标
* @param y 当前处理的列坐标
* @param sum 当前已选取数字的总和
*/
static void solve(int[][] matrix, int[][] used, int x, int y, int sum) {
// 若处理完所有行,更新最大和并返回
if (x == N) {
if (sum > maxResult) {
maxResult = sum;
}
return;
}
// 计算下一个要处理的位置
int nextX = x;
int nextY = y + 1;
// 若当前行处理完毕,切换到下一行的第一个位置
if (nextY >= M) {
nextX = x + 1;
nextY = 0;
}
// 选择1:不选当前位置,直接处理下一个位置
solve(matrix, used, nextX, nextY, sum);
// 选择2:尝试选取当前位置(需检查周围是否有已选位置)
boolean canChoose = true;
// 检查周围8个方向(上下左右及对角线)
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
if (dx == 0 && dy == 0) {
continue; // 跳过当前位置自身
}
// 计算相邻位置坐标
int neighborX = x + dx;
int neighborY = y + dy;
// 检查相邻位置是否在矩阵范围内且已被选取
if (neighborX >= 0 && neighborX < N
&& neighborY >= 0 && neighborY < M
&& used[neighborX][neighborY] == 1) {
canChoose = false;
break;
}
}
if (!canChoose) {
break; // 已确定不能选,提前结束检查
}
}
// 若可以选取当前位置
if (canChoose) {
used[x][y] = 1; // 标记为已选
// 递归处理下一个位置,总和加上当前数字
solve(matrix, used, nextX, nextY, sum + matrix[x][y]);
used[x][y] = 0; // 回溯:取消标记
}
}
}