#include <iostream> using namespace std; #include<vector> int maxSum; int row,col; vector<vector<int>> grid; vector<vector<bool>> used; void backtracking(int pos,int currentSum){//pos指位置,将二维数组拉长成一维;currentSum指现在的和 if(pos == row*col){//到最后一个位置 maxSum = max(maxSum,currentSum); return; } int i = pos / col; int j = pos % col;//一维变二维 backtracking(pos+1, currentSum);//不选择当前的数字 //选择当前数字 vector<pair<int,int>> directions = {{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};//需要从八个方向判断 if(!used[i][j]){ bool canSelect = true;//标记当前元素是否能被选择 for(auto dir:directions){ int newi = i+dir.first; int newj = j+dir.second; if(newi >= 0 && newi < row && newj >=0 && newj < col){//判断元素是否在矩阵范围内且没有被访问 if(used[newi][newj]){ canSelect = false; break; } } } if(canSelect){ used[i][j] = true; backtracking(pos+1, currentSum+grid[i][j]);//遍历下一个位置,且当前和加上当前元素 used[i][j] = false;//回溯,撤销节点 } } } int main() { int T; cin >> T; while(T--){ cin >> row >> col; grid.assign(row,vector<int>(col)); used.assign(row,vector<bool>(col,false)); for(int i=0;i<row;i++) for(int j=0;j<col;j++) cin >> grid[i][j]; maxSum = 0; backtracking(0,0); cout << maxSum << endl; } return 0; }