Zadanie ze spoja - Pola Prostokątów

0

Witam , mam problem z zadaniem - http://pl.spoj.com/problems/SIL/. Obliczyłem pola prostokątów, oraz współrzędne każdego z wierzchołków trójkąta, zapisałem, więc je do 16 zmiennych typu int. Następnie planowałem zrobić program za pomocą if'ów, jednak uświadomiłem sobie, że warunków jest zbyt dużo. Czy ktoś może mi pomóc, nakierować mnie we właściwym kierunku ? Najlepiej ,gdyby zadanie nie wymagało zbyt zaawansowanych czynności, ponieważ moje umiejętności jeszcze nie są na wysokim poziomie. Język oczywiście C++, z góry dzięki i pozdrawiam.

1
unsigned short wsp[8];
main()
{
for(int i=0, i < 8, i++)
 cin>>wsp[i];
//dalszy kod
}

W ten sposób wczytasz sobie współrzędne. Dalej możesz już łatwo policzyć sobie samemu. wsp[i] to tablica, a wartości i od 0-7 w tej tablicy zwrócą Ci podane tam liczby od pierwszej do ósmej. W związku z tym, iż wartość te będą nieujemne, jest to I ćwiartka układu współrzędnych.

0

Tzn chodziło mi o pomoc przy ułożeniu algorytmu, który pomoże mi sprawdzić, czy prostokąty na siebie nie nachodzą i odjąć część wspólną od sumy ich pól. Z wczytaniem danych to problemu nie mam ;]

0

Patrząc na swoje rozwiązanie sprzed kilku lat mam w sumie 9 zmiennych i 8 if-ów. Rozwiązanie jest w skrócie takie:
wynik = pole_1_prostokata + pole_2_prostokata - pole_czesci_wspolnej.

0

No tak, ale największym problemem są te warunki właśnie, dzięki którym możemy określić, czy prostokąty na siebie nachodzą. Może ewentualnie jest możliwość podzielenia się kodem ? Bym sobie wszystkio przeanalizował.

0

Nie jest najpiękniejszy, ale trzymaj :P

#include <stdio.h>

int pole(int ldx, int ldy, int rgx, int rgy)
{
  return (rgx-ldx)*(rgy-ldy);
}

int main()
{
  int aldx,aldy,argx,argy;
  int bldx,bldy,brgx,brgy;
  int p;

  scanf("%d%d%d%d",&aldx,&aldy,&argx,&argy);
  scanf("%d%d%d%d",&bldx,&bldy,&brgx,&brgy);

  p = pole(aldx,aldy,argx,argy) + pole(bldx,bldy,brgx,brgy);

  if (aldx<bldx)
    aldx=bldx; else
  if (aldx>brgx)
    aldx=brgx;

  if (argx<bldx)
    argx=bldx; else
  if (argx>brgx)
    argx=brgx;

  if (aldy<bldy)
    aldy=bldy; else
  if (aldy>brgy)
    aldy=brgy;

  if (argy<bldy)
    argy=bldy; else
  if (argy>brgy)
    argy=brgy;

  p-=pole(aldx,aldy,argx,argy);

  printf("%d\n",p);

  return 0;
}
0

Dzięki

3

To też działa:

#include <cstdio>
#include <algorithm>
using namespace std;

int main()
  {
   int pL,pT,pR,pB,qL,qT,qR,qB;
   scanf("%d%d%d%d%d%d%d%d",&pL,&pT,&pR,&pB,&qL,&qT,&qR,&qB);
   printf("%d\n",(pR-pL)*(pB-pT)+(qR-qL)*(qB-qT)-max(0,min(pR,qR)-max(pL,qL))*max(0,min(pB,qB)-max(pT,qT)));
   return 0;
  }
   printf
     (
      "%d\n",
      (pR-pL)*(pB-pT) // p
      +(qR-qL)*(qB-qT) // q
      -max(0,min(pR,qR)-max(pL,qL))*max(0,min(pB,qB)-max(pT,qT)) // intersect
     );

1 użytkowników online, w tym zalogowanych: 0, gości: 1