[ Mortifera @ 01.01.2011. 17:44 ] @
Pozdrav svima!
Trebao bih pomoc oko jednog zadatka, koji mi vise onako vuce na zadatak sa takmicenja, al je karakteristican (za razliku od matematickih zadataka) sam po sebi zbog crtkanja po Consoli. Trazio sam slicnosti po internetu sa ovim zadatkom, al jednostavno nista. Posto sam primetio da se ovde resavaju zadaci matematicke prirode, pretpostavljao sam da bi mi mogao neko i pomoci oko zadatka. Da ne vazim dalje, ev prekucan tekst:

Opis zadatka:

Nekoliko pravougaonih postera, fotografija ili drugih slika su zaleppljeni na zid. Sve njihove strane su vertikalne ili horizontalne. Svaki pravougaonik moze biti delomicno ili potpuno pokriven nekim drugim pravougaonikom. Duzina granicne linije unije svih pravougaonika se naziva obim.
Potrebno je napisati program koji racuna ovaj obim.

Vrhovi svih pravougaonika imaju celobrojne koordinate. Izvrsna verzija Vaseg programa se mora zvati POSTERI.EXE.

Ulazna datoteka:

Ulazni podaci moraju se nalaziti u tekstualnoj datoteci POSTERI.IN. Prva linija datoteke POSTERI.IN sadrzi broj pravougaonika zalepljenih na zid. I svakoj od sledecih linija nalaze se celobrojne (integer) koordinate donje levog i gornjeg levog desno vrha pravougaonika.
Vrednosti ovih koordinata su date kao uredjeni parovi koji se sastoje od x-koordinate iza koje sledi vrednosti y-koordinate.

Izlazna datoteka:

Izlazna datoteka POSTERI.OUT mora sadrzavati samo jedan red sa nenegativnim cijelim brojem koji predstavlja trazeni obim za date šravougaonike.

Vremensko ogranicenje:

Za svaki testni primer program treba da ponudi resenje za najvise 30 sekundi.

Primeri:

POSTERI.IN
7
-15 0 5 10
-5 8 20 25
15 -4 24 14
0 -6 16 4
2 15 10 22
30 10 36 20
34 0 40 16

POSTERI.OUT
228

Napomena:

Broj pravougaonika nije veci od 5000. Sve koordinate su iz intervala [-10000,10000] i svaki dati pravougaonik ima pozitivnu povrsinu, to jest ne moze se svesti na liniju ili tacku. Numericka vrednost moze zahtevati 32-bitnu reprezenzaciju (tip longint odnosno long).

Zadatak trazi da se taj sav "scenarij" odigra u Console, sto dodatno otezava ovu situaciju realizacije programa. Nikada se nisam susretao sa programom ovakve vrste, pogotov ne u veezi crtkanja po Consoli...Jako bi mi pomoglo bilo kakva pomoc!
[ Mihajlo Cvetanović @ 01.01.2011. 18:08 ] @
Koliko ja vidim ovde nema nikakvog crtanja. Ulaz je fajl Posteri.in u kome su brojevi, izlaz je fajl Posteri.out u kome je samo jedan broj (obim). Nema crtanja.
[ Mortifera @ 01.01.2011. 18:44 ] @
Da, imate pravo. Ali kako na kraju, da izracunam obim novonastalog oblika, kad se pravougaonici koji ce se preklopiti, stopiti u taj novonastali oblik? Treba li mozda slika da nabrzinu nacrtam sta hoce zadatak da kaze?
[ Mortifera @ 01.01.2011. 20:08 ] @
U principu, kad uzmemo zadatak, i banaliziramo ga skroz, trebalo bi ovako nesto slicno da bude:

http://img830.imageshack.us/img830/56/53952386.jpg

Prvi pravougaonik A, prelazi preko drugog B. Ono omedjeno crvenom linijom trebam da izracunam, tj. taj ospeg ili obim, kako god hocete.
[ Mihajlo Cvetanović @ 01.01.2011. 20:35 ] @
Ja bih ovo rešavao tako što bih tražio sve odlomke svih stranica koji nisu unutar nekog pravougaonika. Za svaku stranicu gledaš da li postoji neka druga stranica koja je seče, ili je potpuno unutar pravougaounika, ili je preklopljena drugom stranicom.

1. Stranica se ukršta sa drugom. Tada tražiš koliko treba da isečeš od stranice. Možda je sve do kraja, a možda od jedne stranice treba napraviti dve koje onda rekurzivno treba proveriti i za sve ostale slučajeve sa presecima.

2. Stranica je potpuno unutar nekog pravougaonika. Stranica ne učestvuje u obimu.

3. Stranica je preklopljena drugom stranicom. Ako su pravougaonici sa iste strane onda je to i dalje validna stranica, i nastavljaš proveru sa drugim stranicama. Ako su pravougaonici sa različite strane onda se to posmatra kao slučaj (1).

Svi odlomci koji nisu unutar nekog pravougaonika učestvuju u obimu.
[ Mortifera @ 01.01.2011. 22:12 ] @
Znam kako bih resio zadatak, al kada bi bilo u pitanju samo povrsina, i pozitivan dio XY koordinate. Ovo sa obimom me bas ubi :S
[ Mortifera @ 02.01.2011. 18:32 ] @
Evo ga, done, uradjen. Sad jos nadodajte i to bi bilo to. Hvala Mihajlo sto si ucestvovao koliko toliko u razradi ;) .

Code:

#include <iostream>
using namespace std;

bool mat[10005][10005];

int d[][2] = { {1,0} , {-1,0} , {0,-1} , {0,1} };

int main()
{
    int i,g,k;
    int ulaz, x1,x2,y1,y2;
    cout<<"Unesite broj elemenata u prostoru: "<<endl;
    cin>>ulaz;
    if (ulaz>=5000)
    {
        cout<<"Broj elemenata je veci od predvidjenog! "<<endl;
        return 0;
    }
    for(i=0;i<ulaz;i++)
    {
        cin>>x1;
        cin>>y1;
        cin>>x2;
        cin>>y2;
        x1 += 500 , x2 += 500 , y1 += 500 , y2 += 500;
        for(g=x1;g<x2;g++)
            for(k=y1;k<y2;k++)
                mat[g][k]=true;
    }
    int counter= 0;
    for( int r = 0; r <= 10000; ++r )
    {
        for( int c = 0; c <= 10000; ++c )
        {
            if( mat[r][c] == false ) 
                continue;
            for( int k = 0; k < 4; ++k )
            {
                int nr = r + d[k][0];
                int nc = c + d[k][1];
                if( nr < 0 || nc < 0 || mat[nr][nc] == false ) 
                                counter++;
            }
        }
    }
    cout<<counter<<endl;
    return 0;
}

[ Mihajlo Cvetanović @ 02.01.2011. 18:53 ] @
I, koliko dugo traje trostruka petlja sa 400 miliona iteracija?
[ Mortifera @ 02.01.2011. 18:56 ] @
A sto ne kopiras pa proveris ;)
[ Mihajlo Cvetanović @ 02.01.2011. 22:03 ] @
Nemam kompajler pri ruci, a nisam ni toliko znatiželjan. Ako ti ovo radi posao, onda okej.