Cod sursa(job #637328)

Utilizator Teodor94Teodor Plop Teodor94 Data 20 noiembrie 2011 13:49:24
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 3.28 kb
#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 5;
const int M = 10000;

struct portal3 {
    int v, sens, ord;
};

int n, m, x1[N], x2[N], y1[N], y2[N], c[N], s[N], nr, tmin[M], tp[M], ss[N*N];
bool fr[N];
portal3 a[N];

bool comp(portal3 x, portal3 y) {
    return x.ord < y.ord ? true : false;
}

inline int modul(int x, int y) {
    if (x > y)
        return x - y;
    return y - x;
}

void add(int a[], int b[]) {
    int t = 0, i;

    for (i = 1; i <= a[0] || i <= b[0] || t; ++i, t /= 10)
        a[i] = (t += a[i] + b[i]) % 10;

    a[0] = i - 1;
}

void pune(int x, int a[]) {
    a[0] = 0;
    while (x) {
        a[++a[0]] = x % 10;
        x /= 10;
    }
}

void timp() {
    sort(a+1, a+nr+1, comp);

    int xc = 0, yc = 0;
    memset(tp, 0, sizeof(tp));

    for (int i = 1; i <= nr; ++i)
        if (a[i].sens == 1) {
            memset(ss, 0, sizeof(ss));
            pune(modul(x1[a[i].v], xc), ss);
            add(tp, ss);
            memset(ss, 0, sizeof(ss));
            pune(modul(y1[a[i].v], yc), ss);
            add(tp, ss);
            memset(ss, 0, sizeof(ss));
            pune(c[a[i].v], ss);
            add(tp, ss);

            xc = x2[a[i].v];
            yc = y2[a[i].v];
        }
        else {
            memset(ss, 0, sizeof(ss));
            pune(modul(x2[a[i].v], xc), ss);
            add(tp, ss);
            memset(ss, 0, sizeof(ss));
            pune(modul(y2[a[i].v], yc), ss);
            add(tp, ss);
            memset(ss, 0, sizeof(ss));
            pune(c[a[i].v], ss);
            add(tp, ss);

            xc = x1[a[i].v];
            yc = y1[a[i].v];
        }

    memset(ss, 0, sizeof(ss));
    pune(modul(n, xc), ss);
    add(tp, ss);
    memset(ss, 0, sizeof(ss));
    pune(modul(m, yc), ss);
    add(tp, ss);

}

void copiaza(int a[],int b[]) {
    for (int i = 0; i <= a[0]; ++i)
        b[i] = a[i];
}

bool compar(int a[],int b[]) {
    if (a[0] < b[0])
        return true;
    if (a[0] > b[0])
        return false;

    int i = a[0];
    while (i >= 1 && a[i] == b[i])
        --i;

    if (a[i] < b[i] || i == -1)
        return true;

    return false;
}

void permutari(int p) {
    if (p == nr + 1) {
        timp();
        if (tmin[0] == 0 || compar(tp, tmin))
            copiaza(tp, tmin);
        return;
    }

    for (int i = 1; i <= nr; ++i)
        if (!fr[i]) {
            fr[i] = true;

            a[p].ord = i;
            permutari(p + 1);

            fr[i] = false;
        }
}

void bkt(int p) {
    if (p == 3) {
        nr = 0;
        for (int i = 1; i < 4; ++i)
            if (s[i] != 0) {
                a[++nr].v = i;
                a[nr].sens = s[i];
            }
        permutari(1);
        return;
    }
    for (int i = 0; i < 3; ++i) {
        s[p + 1] = i;
        bkt(p + 1);
    }
}

void afis(int a[]) {
    for (int i = a[0]; i > 0; --i)
        printf("%d", a[i]);
}

void rez() {
    int t;
    scanf("%d", &t);

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

        for (int i = 1; i < 4; ++i)
            scanf("%d%d%d%d%d", &x1[i], &y1[i], &x2[i], &y2[i], &c[i]);

        bkt(0);

        afis(tmin);

        memset(tmin, 0, sizeof(tmin));
    }
}

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

    rez();

    return 0;
}