Pagini recente » Cod sursa (job #147702) | Cod sursa (job #1168245) | Cod sursa (job #1841437) | Cod sursa (job #765084) | Cod sursa (job #3159136)
#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();
cntpoligon--;
fout<<cntpoligon<<'\n';
for(int i=cntpoligon-1;i>=0;i--)
fout<<fixed<<setprecision(6)<<poligon[i].x<<" "<<fixed<<setprecision(6)<<poligon[i].y<<'\n';
return 0;
}