Cod sursa(job #680579)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 15 februarie 2012 19:13:58
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <string.h>
#define i64 long long

using namespace std;

i64 C[10][10];

i64 RF()
{
    int i, j, k;
    for(k = 0; k <= 7; k++)
        for(i = 0; i <= 7; i++)
            for(j = 0; j <= 7; j++)
                if(C[i][k] && C[k][j] && (C[i][j] >= C[i][k] + C[k][j] || !C[i][j]) && i!=j)
                    C[i][j] = C[i][k] + C[k][j];
    return C[0][7];
}

inline i64 abs(i64 x)
{
    if(x < 0)
        return -x;
    return x;
}

inline i64 min(i64 a, i64 b)
{
    if( a < b)
        return a;
    return b;
}

i64 P[10][10];

int main()
{
    ifstream in ("portal3.in");
    ofstream out("portal3.out");

    i64 T, N, M, X1, X2, Y1, Y2, C1, i, j;
    in >> T;
    while(T--)
    {
        in >> N >> M;
        for(i = 0; i < 3; i++)
        {
            in >> X1 >> Y1 >> X2 >> Y2 >> C1;
            C[1 + 2 * i][0] = C[0][1 + 2 * i] = X1 + Y1;
            C[2 + 2 * i][0] = C[0][2 + 2 * i] = X2 + Y2;
            C[2 * i + 2][2 * i + 1] = C[2 * i + 1][2* i + 2] = min(abs(X2 - X1) + abs(Y2 - Y1), C1);
            C[7][2 * i + 1] = C[1 + 2 * i][7] = N - X1 + M - Y1;
            C[7][2 * i + 2] = C[2 * i + 2][7] = N + M - X2 - Y2;

            P[2 * i + 1][1] = X1;
            P[2 * i + 1][2] = Y1;
            P[2 * i + 2][1] = X2;
            P[2 * i + 2][2] = Y2;

            for(j = 2 * i; j > 0; j--)
            {
                C[j][2 * i + 1] = C[2 * i + 1][j] = abs(P[j][1] - X1) + abs(P[j][2] - Y1);
                C[j][2 * i + 2] = C[2 * i + 2][j] = abs(P[j][1] - X2) + abs(P[j][2] - Y2);
            }
        }

        C[0][7] = C[7][0] = N + M;

        out << RF() << '\n';
    }
    return 0;
}