Cod sursa(job #1557210)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 27 decembrie 2015 00:19:56
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <cstdio>
#include <algorithm>
#include <cstring>

#define DIM 16
#define INF 2147483647
#define f first
#define s second
using namespace std;

int N, T, C1, C2, C3, minim;
int X1, X2, X3, X4, X5, X6, X7, X8;
int Y1, Y2, Y3, Y4, Y5, Y6, Y7, Y8;
int Dist[DIM][DIM], Viz[DIM], Sol[DIM];
pair <int, int> Points[DIM];

int abs (int X) {
    return (X > 0) ? X : -X;
}

inline int getDistance (pair <int, int> X, pair <int, int> Y) {
    return abs (X.f - Y.f) + abs (X.s - Y.s);
}

inline int getDist (int i, int j) {
    return Dist[i][j] ? Dist[i][j] : getDistance (Points[i], Points[j]);
}

void backTrack (int pos, int Distance) {

    if (minim < Distance) return;
    if (Viz[N]) minim = min (minim, Distance);

    for (int i = 2; i <= N; i ++) {
        if (!Viz[i]) {

            Viz[i] = 1; Sol[pos] = i;
            backTrack (pos + 1, Distance + getDist(Sol[pos - 1], Sol[pos]));
            Viz[i] = 0; Sol[pos] = 0;
        }
    }

    return;
}

int main () {

    freopen ("portal3.in" ,"r", stdin );
    freopen ("portal3.out","w", stdout);

    scanf ("%d", &T);
    for (int t = 1; t <= T; t ++) {

        scanf ("%d %d", &X8, &Y8);
        scanf ("%d %d %d %d %d", &X2, &Y2, &X3, &Y3, &C1);
        scanf ("%d %d %d %d %d", &X4, &Y4, &X5, &Y5, &C2);
        scanf ("%d %d %d %d %d", &X6, &Y6, &X7, &Y7, &C3);

        N = 0;
        Points[++N] = make_pair (X1, Y1); Points[++N] = make_pair (X2, Y2);
        Points[++N] = make_pair (X3, Y3); Points[++N] = make_pair (X4, Y4);
        Points[++N] = make_pair (X5, Y5); Points[++N] = make_pair (X6, Y6);
        Points[++N] = make_pair (X7, Y7); Points[++N] = make_pair (X8, Y8);

        memset (Dist, 0, sizeof (Dist));
        Dist[2][3] = Dist[3][2] = C1;
        Dist[4][5] = Dist[5][4] = C2;
        Dist[6][7] = Dist[7][6] = C3;

        minim = INF; Sol[1] = 1; backTrack (2, 0);
        printf ("%d\n", minim);
    }

    return 0;
}