求助
查看原帖
求助
207812
Chouquet楼主2021/9/10 22:08

在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;
}
2021/9/10 22:08
加载中...