思路:
由于这道题数据范围<=6,所以直接可以用搜索一个接一个的搜,取到一个数判断行不行,然后在将它周围的标记,最后回溯。
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int q;
int n, m, ans;
int a[100][100];
int v[100][100];
int dx[8]={0, 1, 0, -1, 1, 1, -1, -1};
int dy[8]={1, 0, -1, 0, 1, -1, 1, -1};
void dfs(int x, int y, int sum)
{
ans=max(ans, sum);
if(y>m)
x=x+1, y=1;
if(x>n)
return;
dfs(x, y+1, sum);
if(v[x][y]==0)
{
for(int i=0; i<8; i++)
v[x+dx[i]][y+dy[i]]++;
dfs(x, y+1, sum+a[x][y]);
for(int i=0; i<8; i++)
v[x+dx[i]][y+dy[i]]--;
}
}
int main()
{
scanf("%d", &q);
while(q--)
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
scanf("%d", &a[i][j]);
dfs(1, 1, 0);
printf("%d\n", ans);
ans=0;
}
}