dx = [-1,-1,-1,0,0,1,1,1] dy = [-1,0,1,-1,1,-1,0,1] def in_bound(x:int, y:int, N:int, M:int): return 0 <= x < N and 0 <= y < M def dfs(N:int, M:int, maze:list, used:list, curr_sum:int, start:int): global max_num flag = True for pos in range(start, N*M): i, j = divmod(pos, M) # 找到下一个没被用到的点 if used[i][j] == -1: flag = False # 选中的点记为1 used[i][j] = 1 blocked = [] # 周边点记为0 for k in range(8): nx = i + dx[k] ny = j + dy[k] if in_bound(nx, ny, N, M) and used[nx][ny] == -1: used[nx][ny] = 0 blocked.append((nx, ny)) # 继续寻找 dfs(N, M, maze, used, curr_sum + maze[i][j], pos + 1) # 回溯状态 used[i][j] = -1 for x, y in blocked: used[x][y] = -1 if flag: # 没有点能再加入了 max_num = max(max_num, curr_sum) def calculate_num(N: int, M: int, maze: list): global max_num used = [[-1]*M for _ in range(N)] max_num = 0 dfs(N, M, maze, used, 0, 0) return max_num T = int(input()) for _ in range(T): N, M = map(int, input().split()) maze = [list(map(int, input().split())) for _ in range(N)] print(calculate_num(N, M, maze))