#include<bits/stdc++.h>
using namespace std;
const int N=10;
int n,m,t;
int g[N][N];
int st[N][N];//判断某个点是否被走过,这里不能用bool,可能会出现多重状态
int ans;
int dx[]={1,1,1,0,0,-1,-1,-1};
int dy[]={1,0,-1,1,-1,1,0,-1};
void dfs(int x,int y,int sum)
{
// printf("%d %d %d\n",x,y,sum);
if(y>=m+1)//到了一行的尽头,让行++,列=1
{
y=1;
x++;
// return;
}
if(x>=n+1)//搜完了
{
ans=max(ans,sum);
return;
}
dfs(x,y+1,sum);//不选当前点(x,y)
if(st[x][y]==0)//选当前点(x,y)
{
st[x][y]++;//标记点(x,y)
for(int i=0;i<8;i++)//标记周围的点
{
int sx=x+dx[i],sy=y+dy[i];
st[sx][sy]++;
}
dfs(x,y+1,sum+g[x][y]);//搜索下一个点
//回溯
st[x][y]--;
for(int i=0;i<8;i++)
{
int sx=x+dx[i],sy=y+dy[i];
st[sx][sy]--;
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
ans=0;//每一次都重置最大值
memset(st,0,sizeof st);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&g[i][j]);
}
}
dfs(1,1,0);//从点(1,1)开始搜
printf("%d\n",ans);
}
}
11-13
1718

06-23
288
