Cod sursa(job #2447682)

Utilizator DavidAA007Apostol David DavidAA007 Data 14 august 2019 11:57:40
Problema Infasuratoare convexa Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.9 kb
#include<fstream>
#include<algorithm>
#include<iostream>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int n,i,dim;
double panta,pmin;
struct punct
{
    double x;
    double y;
};
punct e[1005],infasuratoare[1005],P,Q,minn,P1,P2,P3,P4;
int main()
{
    f>>n;
    for(i=1;i<=n;i++)
        f>>e[i].x>>e[i].y;
    dim=0;
    for(i=1;i<=n;i++)
    {
        if(e[i].x<P4.x)
            P4=e[i];
        if(e[i].x>P2.x)
            P2=e[i];
        if(e[i].y<P1.y)
            P1=e[i];
        if(e[i].y>P3.y)
            P3=e[i];
    }
    for(i=1;i<=n;i++)
    {
        if(e[i].x==P4.x)
            if(e[i].y>P4.y)
                P4=e[i];
        if(e[i].x==P2.x)
            if(e[i].y<P2.y)
                P2=e[i];
        if(e[i].y==P1.y)
            if(e[i].x<P1.x)
                P1=e[i];
        if(e[i].y==P3.y)
            if(e[i].x>P3.x)
                P3=e[i];
    }
    ///cout<<P1.x<<" "<<P1.y<<"\n";
    ///cout<<P2.x<<" "<<P2.y<<"\n";
    ///cout<<P3.x<<" "<<P3.y<<"\n";
    ///cout<<P4.x<<" "<<P4.y<<"\n";
    dim++;
    infasuratoare[dim]=P1;
    while(! (P.x==P2.x && P.y==P2.y))
    {
        pmin=2147348646;
        panta=0;
        for(i=1;i<=n;i++)
        {
            if(e[i].x>P.x)
            {
                Q=e[i];
                if(! (P.x==Q.x && P.y==Q.y))
                {
                    ///verificam daca punctul Q este cel cautat
                    ///calculam panta
                    panta=(Q.y-P.y)/(Q.x-P.x);
                    if(panta<pmin)
                    {
                        pmin=panta;
                        minn=Q;
                    }
                }
            }
        }
        P=minn;
        dim++;
        infasuratoare[dim]=P;
    }
    while(! (P.x==P3.x && P.y==P3.y))
    {
        pmin=2147348646;
        panta=0;
        for(i=1;i<=n;i++)
        {
            if(e[i].y>P.y)
            {
                Q=e[i];
                if(! (P.x==Q.x && P.y==Q.y))
                {
                    ///verificam daca punctul Q este cel cautat
                    ///calculam panta
                    panta=(Q.y-P.y)/(Q.x-P.x);
                    if(panta<pmin)
                    {
                        pmin=panta;
                        minn=Q;
                    }
                }
            }
        }
        P=minn;
        dim++;
        infasuratoare[dim]=P;
    }
    while(! (P.x==P4.x && P.y==P4.y))
    {
        pmin=2147348646;
        panta=0;
        for(i=1;i<=n;i++)
        {
            if(e[i].x<P.x)
            {
                Q=e[i];
                if(! (P.x==Q.x && P.y==Q.y))
                {
                    ///verificam daca punctul Q este cel cautat
                    ///calculam panta
                    panta=(Q.y-P.y)/(Q.x-P.x);
                    if(panta<pmin)
                    {
                        pmin=panta;
                        minn=Q;
                    }
                }
            }
        }
        P=minn;
        dim++;
        infasuratoare[dim]=P;
    }
    while(! (P.x==P1.x && P.y==P1.y))
    {
        pmin=2147348646;
        panta=0;
        for(i=1;i<=n;i++)
        {
            if(e[i].y<P.y)
            {
                Q=e[i];
                if(! (P.x==Q.x && P.y==Q.y))
                {
                    ///verificam daca punctul Q este cel cautat
                    ///calculam panta
                    panta=(Q.y-P.y)/(Q.x-P.x);
                    if(panta<pmin)
                    {
                        pmin=panta;
                        minn=Q;
                    }
                }
            }
        }
        P=minn;
        dim++;
        infasuratoare[dim]=P;
    }
    infasuratoare[dim].x=0;
    infasuratoare[dim].y=0;
    dim--;
    for(i=1;i<=dim;i++)
        g<<infasuratoare[i].x<<" "<<infasuratoare[i].y<<"\n";
    f.close();
    g.close();
    return 0;
}