Pagini recente » Cod sursa (job #2835114) | Cod sursa (job #388818) | Cod sursa (job #2409726) | Cod sursa (job #3286947) | Cod sursa (job #3159129)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <iomanip>
using namespace std;
ifstream fin("infasuratoare.in");
ofstream fout("infasuratoare.out");
struct punct{
double x,y;
};
int n;
int cntpoligon;
punct a[120005];
punct poligon[120005];
bool comparator(punct a,punct b)
{
if(a.x<b.x)
return 1;
if(a.x>b.x)
return 0;
if(a.x==b.x)
{
return a.y<b.y;
}
}
int determinant(punct p,punct q,punct r)
{
int det=(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);
if (det==0)
return 0;
if(det>0)
return 1;
if(det<0)
return 2;
}
void fpoligonsus()
{
for(int i=1;i<n;i++)
{
while(cntpoligon>=2 && determinant(poligon[cntpoligon-2],poligon[cntpoligon-1],a[i])!=1)
{
cntpoligon--;
}
poligon[cntpoligon++]=a[i];
}
}
void fpoligonjos()
{
for(int i=n-2;i>=0;i--)
{
while(cntpoligon>=2 && determinant(poligon[cntpoligon-2],poligon[cntpoligon-1],a[i])!=1)
{
cntpoligon--;
}
poligon[cntpoligon++]=a[i];
}
}
int main()
{
fin>>n;
for(int i=0;i<n;i++)
{
fin>>a[i].x>>a[i].y;
}
sort(a,a+n,comparator);
poligon[cntpoligon++]=a[0];
fpoligonsus();
fpoligonjos();
fout<<cntpoligon-1<<'\n';
for(int i=0;i<cntpoligon-1;i++)
fout<<fixed<<setprecision(6)<<poligon[i].x<<" "<<fixed<<setprecision(6)<<poligon[i].y<<'\n';
return 0;
}