Cod sursa(job #1503036)

Utilizator akaprosAna Kapros akapros Data 15 octombrie 2015 14:33:27
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxP 10
using namespace std;
int n, i, j, m, t, c[maxP], sol, sum;
struct portal
{
    int x;
    int y;
}p[maxP], fp;
bool used[maxP];
int dmanh(portal a, portal b)
{
    return abs(a.x - b.x) + abs(a.y - b.y);
}
void back(int x)
{
    int i, aux, k;
    if (x >= 6)
        return ;
    for (i = 1; i <= 6; ++ i)
        if (!used[i])
    {
        if (i % 2 == 1)
            k = i + 1;
        else
            k = i - 1;
        sol = min(sol, c[i] + sum + dmanh(p[i], p[j]) + dmanh(p[k], fp));
        sum += c[i] + dmanh(p[i], p[j]) + dmanh(p[k], fp);
        used[i] = 1;
        aux = j;
        j = k;
        back(x + 1);
        j = aux;
        used[i] = 0;
        sum -= c[i] + dmanh(p[i], p[j]) + dmanh(p[k], fp);
    }
}
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;
        fp.x = n;
        fp.y = m;
        j = 0;
        sum = 0;
        for (i = 1; i < 6; i += 2)
        scanf("%d %d %d %d %d", &p[i].x, &p[i].y, &p[i + 1].x, &p[i + 1].y, &c[i]),
              c[i + 1] = c[i];
        back(0);
        printf("%d\n", sol - 2);
    }
}
int main()
{
    rsw();
    return 0;
}