Cod sursa(job #1200574)

Utilizator hrazvanHarsan Razvan hrazvan Data 22 iunie 2014 21:52:33
Problema Reuniune Scor 20
Compilator c Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <stdio.h>
typedef struct{
  int x1, x2, y1, y2;
}dreptunghi;

int max2(int a, int b){
  if(a > b) return a;
  return b;
}
int min2(int a, int b){
  if(a < b) return a;
  return b;
}

int supr2(dreptunghi a, dreptunghi b, dreptunghi *c){
  (*c).x1 = max2(a.x1, b.x1);
  (*c).x2 = min2(a.x2, b.x2);
  (*c).y2 = min2(a.y2, b.y2);
  (*c).y1 = max2(a.y1, b.y1);
  if((*c).x1 > (*c).x2 || (*c).y2 < (*c).y1) return 0;
  return ((*c).x2 - (*c).x1) * ((*c).y2 - (*c).y1);
}
int supr3(dreptunghi a, dreptunghi b, dreptunghi c, dreptunghi *e){
  dreptunghi d;
  int rez;
  rez = supr2(a, b, &d);
  if(rez == 0)  return 0;
  rez = supr2(d, c, e);
  if(rez == 0)  return 0;
  return ((*e).x2 - (*e).x1) * ((*e).y2 - (*e).y1);
}

int perim2(dreptunghi a, dreptunghi b){
  dreptunghi c;
  supr2(a, b, &c);
  return 2 * (c.x2 - c.x1 + c.y2 - c.y1);
}

int perim3(dreptunghi a, dreptunghi b, dreptunghi c){
  dreptunghi d;
  supr3(a, b, c, &d);
  return 2 * (d.x2 - d.x1 + d.y2 - d.y1);
}

int main(){
  FILE *in = fopen("reuniune.in", "r");
  int i;
  dreptunghi dr[3];
  for(i = 0; i < 3; i++){
    fscanf(in, "%d%d%d%d", &dr[i].x1, &dr[i].y1, &dr[i].x2, &dr[i].y2);
  }
  fclose(in);
  int supr, perim;
  dreptunghi aux;
  supr = supr2(dr[0], dr[0], &aux) + supr2(dr[1], dr[1], &aux) + supr2(dr[2], dr[2], &aux)
        - supr2(dr[0], dr[1], &aux) - supr2(dr[0], dr[2], &aux) - supr2(dr[1], dr[2], &aux)
        + supr3(dr[0], dr[1], dr[2], &aux);
 perim = perim2(dr[0], dr[0]) + perim2(dr[1], dr[1]) + perim2(dr[2], dr[2])
        - perim2(dr[0], dr[1]) - perim2(dr[0], dr[2]) - perim2(dr[1], dr[2])
        + perim3(dr[0], dr[1], dr[2]);
  FILE *out = fopen("reuniune.out", "w");
  fprintf(out, "%d %d", supr, perim);
  fclose(out);
  return 0;
}