Cod sursa(job #2538799)

Utilizator miha5092mihai mitrea miha5092 Data 5 februarie 2020 09:59:23
Problema Inundatii Scor 0
Compilator cpp-64 Status done
Runda simulare_miri Marime 3.13 kb
#include <fstream>

using namespace std;

ifstream in("inundatii.in");
ofstream out("inundatii.out");

struct coordonate
{
    int x, y, z;
};

int n;
coordonate hut[50005];

long long ans = 1000000000000000000000000;

bool domin(int i)
{
    if(hut[i].x < hut[i+1].x && hut[i].y < hut[i+1].y && hut[i].z < hut[i+1].z)
        return true;
    else
        return false;
}

void brut(int i, long long cost)
{
    if(i == n)
    {
        ans = min(ans, cost);
    }
    else
    {
        if(domin(i) == true)
            brut(i+1,cost);
        else
        {
            int jos = 0; // micsorez casa i
            int sus = 0; // maresc casa i+1
            int x, y, z; // deplasarea
            if(hut[i-1].x + 1 < hut[i+1].x && hut[i-1].y + 1 < hut[i+1].y && hut[i-1].z + 1 < hut[i+1].z) // verifica daca se poate
            {
                if(hut[i].x > hut[i+1].x) // scad pe coordonata x
                {
                    jos = jos + (hut[i].x - hut[i+1].x + 1) ;
                    x = hut[i].x - hut[i-1].x + 1 ;
                    hut[i].x = hut[i+1].x - 1 ;

                }
                if(hut[i].y > hut[i+1].y) // scad pe coordonata y
                {
                    jos = jos + (hut[i].y - hut[i+1].y + 1) ;
                    y = hut[i].y - hut[i-1].y + 1 ;
                    hut[i].y = hut[i+1].y - 1 ;
                }
                if(hut[i].z > hut[i+1].z) // scard pe coordonata z
                {
                    jos = jos + (hut[i].z - hut[i+1].z + 1) ;
                    z = hut[i].z - hut[i-1].z + 1 ;
                    hut[i].z = hut[i+1].z - 1 ;
                }
                brut(i+1, cost+jos); // trec la urmatoarea casa
                hut[i].x += x ; // readuc la coordonatele initiale
                hut[i].y += y ;
                hut[i].z += z ;
                x = y = z = 0 ;
            }
            {
                if(hut[i].x > hut[i+1].x) // scad pe coordonata x
                {
                    sus = sus + (hut[i].x - hut[i+1].x + 1) ;
                    x = hut[i].x - hut[i-1].x + 1 ;
                    hut[i+1].x = hut[i].x + 1 ;

                }
                if(hut[i].y > hut[i+1].y) // scad pe coordonata y
                {
                    sus = sus + (hut[i].y - hut[i+1].y + 1) ;
                    y = hut[i].y - hut[i-1].y + 1 ;
                    hut[i+1].y = hut[i].y + 1 ;
                }
                if(hut[i].z > hut[i+1].z) // scard pe coordonata z
                {
                    sus = sus + (hut[i].z - hut[i+1].z + 1) ;
                    z = hut[i].z - hut[i-1].z + 1 ;
                    hut[i+1].z = hut[i].z + 1 ;
                }
                brut(i+1, cost+sus); // trec la urmatoarea casa
                hut[i+1].x -= x ; // readuc la coordonatele initiale
                hut[i+1].y -= y ;
                hut[i+1].z -= z ;
                x = y = z = 0 ;
            }
        }
    }
}

int main()
{
    in >> n ;
    for(int i=1; i<=n; i++)
        in >> hut[i].x >> hut[i].y >> hut[i].z ;
    brut(1, 0);
    out << ans ;
    return 0;
}