在udebug上的数据过不了。
#include <cstdio>
#include <cstring>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define MAXN 11
//f[i][j][k][l][x][y]表示三只小猪分别走到(i,j),(k,l),(x,y)能吃到的最大松子数。
int n, m, a[MAXN + 2][MAXN + 2], f[MAXN + 2][MAXN + 2][MAXN + 2][MAXN + 2][MAXN + 2][MAXN + 2];
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d", &m);
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
memset(f, -1, sizeof f);
if (a[1][1] == 2) {
puts("-1");
continue;
}
for (int i = 1; i <= m; i++)
for (int j = 1; j <= m; j++)
for (int k = 1; k <= m; k++)
for (int l = 1; l <= m; l++)
for (int x = 1; x <= m; x++)
for (int y = 1; y <= m; y++) {
int &ans = f[i][j][k][l][x][y];
if (i == j && j == k && k == l && l == x && x == y && y == 1) {
ans = a[i][j];
continue;
}
if (a[i][j] != 2 && a[k][l] != 2 && a[x][y] != 2) {
for (int S = 0; S < (1 << 3); S++) {//枚举小猪从哪里过来
int ls[7] = {i, j, k, l, x, y};
for (int tmp = 0; tmp < 3; tmp++)
if ((S >> tmp) & 1)//1:从上面过来;0:从左边过来
--ls[tmp << 1];
else
--ls[tmp << 1 | 1];
ans = max(ans, f[ls[0]][ls[1]][ls[2]][ls[3]][ls[4]][ls[5]]);
}
if (ans != -1)
if (i == k && k == x && j == l && l == y)
ans += a[i][j];
else if (i == k && j == l)
ans += a[k][l] + a[x][y];
else if (i == x && j == y)
ans += a[i][j] + a[k][l];
else if (k == x && l == y)
ans += a[i][j] + a[x][y];
else
ans += a[i][j] + a[k][l] + a[x][y];
}
}
printf("%d\n", f[m][m][m][m][m][m]);
}
return 0;
}