Cod sursa(job #1503058)

Utilizator akaprosAna Kapros akapros Data 15 octombrie 2015 15:18:46
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define k 6
using namespace std;
int n, q, i, j, m, t;
long long c[k], sol, dp[1 << k + 1][k];
struct portal
{
    int x;
    int y;
    int z;
    int t;
}p[k];
void rsw()
{
    freopen("portal3.in", "r", stdin);
    freopen("portal3.out", "w", stdout);
    scanf("%d", &t);
    while (t --)
    {
        scanf("%d %d", &n, &m);
        sol = m + n;
        j = 0;
        for (i = 0; i < 3; ++ i)
        scanf("%d %d %d %d %d", &p[i].x, &p[i].y, &p[i].z, &p[i].t, &c[i]);
        for (i = 3; i < 6; ++ i)
        {
            p[i] = p[i - 3];
            swap(p[i].x, p[i].z);
            swap(p[i].y, p[i].t);
            c[i] = c[i - 3];
        }
        for (i = 0; i < 1 << k; ++ i)
            for (j = 0; j < k; ++ j)
                if (i & (1 << j))
            {
                if (i == 1 << j)
                    dp[i][j] = c[j] + p[j].x + p[j].y;
                else
                {
                    dp[i][j] = m + n;
                    for (q = 0; q < k; ++ q)
                        if (i & (1 << q) && q != j)
                           if (dp[i][j] > c[j] + dp[i ^ (1 << j)][q] + abs(p[q].z - p[j].x) + abs(p[q].t - p[j].y))
                            dp[i][j] = c[j] + dp[i ^ (1 << j)][q] + abs(p[q].z - p[j].x) + abs(p[q].t - p[j].y);
                }
                if (sol > dp[i][j] + abs(n - p[j].z) + abs(m - p[j].t))
                    sol = dp[i][j] + abs(n - p[j].z) + abs(m - p[j].t);
            }
        printf("%lld\n", sol);
    }
}
int main()
{
    rsw();
    return 0;
}