Pagini recente » Cod sursa (job #2682444) | Cod sursa (job #1199244) | Cod sursa (job #1259809) | Cod sursa (job #2727945) | Cod sursa (job #2285155)
#include <fstream>
#include <algorithm>
#include <iostream>
#include <iomanip>
using namespace std;
ifstream f("infasuratoare.in");
ofstream g("infasuratoare.out");
int n,poz,vf,stiva[120500],l,ok;
struct punct{
double x,y;
}v[120500],p;
int position(punct p1, punct p2, punct p3)
{
int val = (p3.x - p1.x) * (p2.y - p1.y) - (p3.y - p1.y) * (p2.x - p1.x);
if(val <=0) return 1;
return 0;
}
int main()
{
f>>n;
p.x = p.y = 1000000003;
for(int i = 1; i<=n ; i++) { f>>v[i].x>>v[i].y;
if(v[i].x < p.x || v[i].x == p.x && v[i].y < p.y) {
p.x = v[i].x;
p.y = v[i].y;
poz = i;
}
}
swap(v[1],v[poz]);
//for(int i = 1; i<=n; i++) g<<v[i].x<<' '<<v[i].y<<'\n';
l = n;
ok = 1;
while(ok) { ok = 0;
for(int i = 2; i<l; i++) if(!position(v[1],v[i],v[i+1])) swap(v[i],v[i+1]),ok=1;
l--;
}
stiva[++vf] = 1;
stiva[++vf] = 2;
stiva[n+1] = n+1;
for(int i = 3; i<=n+1; i++)
{
if(position(v[stiva[vf-1]],v[stiva[vf]],v[i])) stiva[++vf] = i;
else
{
stiva[vf] = i;
}
}
g<<vf-1<<setprecision(6)<<fixed<<'\n';
for(int i = 1; i<=vf-1 ; i++) g<<setprecision(6)<<v[stiva[i]].x<<' '<<setprecision(6)<<v[stiva[i]].y<<'\n';
return 0;
}