Pagini recente » Cod sursa (job #175106) | Cod sursa (job #2676432) | Cod sursa (job #69089) | Cod sursa (job #1000571) | Cod sursa (job #2538799)
#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;
}