Cod sursa(job #150984)

Utilizator vlad_popaVlad Popa vlad_popa Data 7 martie 2008 18:07:51
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 8.28 kb
#include <stdio.h>

FILE *f,*g;

int x1,y1,x2,y2,x3,y3,a1,b1,a2,b2,a3,b3,arie1,arie2,arie3,per1,per2,per3,reza,rezp;
struct coord {int x,y,a,b;};
struct coord m2;

int modul (int x)
{
    return x >= 0 ? x : -x;
}

int arie ( int x1, int y1, int a1, int b1 )
{
  return modul( a1 - x1 ) * modul( b1 - y1 );
}

int per ( int x1, int y1, int a1, int b1 )
{ 
  if (!(a1 - x1)) return b1 - y1;
  if (!(b1 - y1)) return a1 - x1; 
  return modul( a1 - x1 ) * 2 + modul( b1 - y1 ) * 2;
}

int intera ( int x1, int y1, int a1, int b1, int x2, int y2, int a2, int b2 )
{ if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 <= b1)
     return arie (x2, y2, a1, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 > b1)
     return arie (x2, y2, a1, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 < a1 && b2 > b1)
     return arie (x2, y2, a2, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 <= a1 && b2 <= b1)
     return arie (x2, y2, a2, b2);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > x1 && a2 <= a1 && b1 >= b2)
     return arie (x1, y2, a2, b2);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > a1 && b2 > b1)
     return arie (x1, y2, a1, b1);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 <= a1 && a2 >= x1 && b2 >= b1)
     return arie (x1, y2, a2, b1);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 >= a1 && b2 <= b1)
     return arie (x1, y2, a1, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > y1 && b2 <= b1)
     return arie (x1, y1, a2, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > a1)
    if (b2 > y1 && b2 <= b1)
     return arie (x1, y1, a1, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > a1 && b2 >= b1)
    return arie (x1, y1, a1, b1);
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > b1)
     return arie (x1, y1, a2, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 < a1 && b2 > y1 && b2 <= b1)
     return arie (x2, y1, a2, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 > y1 && b2 <= b1)
     return arie (x2, y1, a1, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 >= b1)
     return arie (x2, y1, a1, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 <= a1 && b2 > b1)
     return arie (x2, y1, a2, b1);
  if (x1 == x2 && y1 == y2 && a1 == a2 && b1 == b2)
   return arie (x1, y1, a1, b1);
  return 0;
}

int interp ( int x1, int y1, int a1, int b1, int x2, int y2, int a2, int b2 )
{ if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 <= b1)
     return per (x2, y2, a1, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 > b1)
     return per (x2, y2, a1, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 < a1 && b2 > b1)
     return per (x2, y2, a2, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 <= a1 && b2 <= b1)
     return per (x2, y2, a2, b2);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > x1 && a2 <= a1 && b1 >= b2)
     return per (x1, y2, a2, b2);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > a1 && b2 > b1)
     return per (x1, y2, a1, b1);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 <= a1 && a2 >= x1 && b2 >= b1)
     return per (x1, y2, a2, b1);
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 >= a1 && b2 <= b1)
     return per (x1, y2, a1, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > y1 && b2 <= b1)
     return per (x1, y1, a2, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > a1)
    if (b2 > y1 && b2 <= b1)
     return per (x1, y1, a1, b2);
  if (x2 < x1 && y2 < y1)
   if (a2 > a1 && b2 >= b1)
    return per (x1, y1, a1, b1);
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > b1)
     return per (x1, y1, a2, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 < a1 && b2 > y1 && b2 <= b1)
     return per (x2, y1, a2, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 > y1 && b2 <= b1)
     return per (x2, y1, a1, b2);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 >= b1)
     return per (x2, y1, a1, b1);
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 <= a1 && b2 > b1)
     return per (x2, y1, a2, b1);
  if (x1 == x2 && y1 == y2 && a1 == a2 && b1 == b2)
   return per (x1, y1, a1, b1);
  return 0;
}

coord intera2 ( int x1, int y1, int a1, int b1, int x2, int y2, int a2, int b2 )
{ struct coord m;
  m.x=-100000;
  m.y=-100000;
  m.a=-100000;
  m.b=-100000;
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 <= b1)
     { m.x = x2; m.y = y2; m.a = a1; m.b = b2; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 > a1 && b2 > b1)
     { m.x = x2; m.y = y2; m.a = a1; m.b = b1; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 < a1 && b2 > b1)
     { m.x = x2; m.y = y2; m.a = a2; m.b = b1; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < b1 && y2 >= y1)
    if (a2 <= a1 && b2 <= b1)
     { m.x = x2; m.y = y2; m.a = a2; m.b = b2; return m; }
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > x1 && a2 <= a1 && b1 >= b2)
     { m.x = x1; m.y = y2; m.a = a2; m.b = b2; return m; }
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 > a1 && b2 > b1)
     { m.x = x1; m.y = y2; m.a = a1; m.b = b1; return m; }
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 <= a1 && a2 >= x1 && b2 >= b1)
     { m.x = x1; m.y = y2; m.a = a2; m.b = b1; return m; }
  if (x2 < x1)
   if (y2 >= y1 && y2 < b1)
    if (a2 >= a1 && b2 <= b1)
     { m.x = x1; m.y = y2; m.a = a1; m.b = b2; return m; }
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > y1 && b2 <= b1)
     { m.x = x1; m.y = y1; m.a = a2; m.b = b2; return m; }
  if (x2 < x1 && y2 < y1)
   if (a2 > a1)
    if (b2 > y1 && b2 <= b1)
     { m.x = x1; m.y = y1; m.a = a1; m.b = b2; return m; }
  if (x2 < x1 && y2 < y1)
   if (a2 > a1 && b2 >= b1)
     { m.x = x1; m.y = y1; m.a = a1; m.b = b1; return m; }
  if (x2 < x1 && y2 < y1)
   if (a2 > x1 && a2 <= a1)
    if (b2 > b1)
     { m.x = x1; m.y = y1; m.a = a2; m.b = b1; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 < a1 && b2 > y1 && b2 <= b1)
     { m.x = x2; m.y = y1; m.a = a2; m.b = b2; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 > y1 && b2 <= b1)
     { m.x = x2; m.y = y1; m.a = a1; m.b = b2; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 >= a1 && b2 >= b1)
     { m.x = x2; m.y = y1; m.a = a1; m.b = b1; return m; }
  if (x2 >= x1 && x2 < a1)
   if (y2 < y1)
    if (a2 <= a1 && b2 > b1)
     { m.x = x2; m.y = y1; m.a = a2; m.b = b1; return m; }
  if (x1 == x2 && y1 == y2 && a1 == a2 && b1 == b2)
     { m.x = x1; m.y = y1; m.a = a1; m.b = b1; return m; }
  return m;
}

int intersecta ()
{ m2 = intera2 (x1,y1,a1,b1,x2,y2,a2,b2);
  if ( m2.x != -100000 )
    return intera (x3,y3,a3,b3,m2.x,m2.y,m2.a,m2.b);
   else
    return 0;
}

int intersectp ()
{ m2 = intera2 (x1,y1,a1,b1,x2,y2,a2,b2);
  if ( m2.x != -100000 )
    return interp (x3,y3,a3,b3,m2.x,m2.y,m2.a,m2.b);
   else
    return 0;
}

int
 main ()
{ f = fopen ( "reuniune.in", "rt" );
  g = fopen ( "reuniune.out", "wt" );
  fscanf ( f, "%d%d%d%d", &x1, &y1, &a1, &b1 );
  fscanf ( f, "%d%d%d%d", &x2, &y2, &a2, &b2 );
  fscanf ( f, "%d%d%d%d", &x3, &y3, &a3, &b3 );
  arie1 = intera ( x1, y1, a1, b1, x2, y2, a2, b2 );
  arie2 = intera ( x2, y2, a2, b2, x3, y3, a3, b3 );
  arie3 = intera ( x1, y1, a1, b1, x3, y3, a3, b3 );
  per1 = interp ( x1, y1, a1, b1, x2, y2, a2, b2 );
  per2 = interp ( x2, y2, a2, b2, x3, y3, a3, b3 );
  per3 = interp ( x1, y1, a1, b1, x3, y3, a3, b3 );
  reza = arie ( x1, y1, a1, b1 ) + arie ( x2, y2, a2, b2 ) +
         arie ( x3, y3, a3, b3) - arie1 - arie2 - arie3 +
         intersecta ();
  rezp = per ( x1, y1, a1, b1 ) + per ( x2, y2, a2, b2 ) +
         per ( x3, y3, a3, b3) - per1 - per2 - per3 +
         intersectp ();
  fprintf ( g, "%d %d\n", reza, rezp );
  //mai trebuie cazul atunci cand calculeaza perimetrul a doua dreptunghiuri vecine
  fclose (f);
  fclose (g);
  return 0;
}