Cod sursa(job #363406)

Utilizator APOCALYPTODragos APOCALYPTO Data 13 noiembrie 2009 07:27:35
Problema Infasuratoare convexa Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb

#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
struct data{
    int x;
    int y;
    int mark;
    int ind;
    int index;
};
data pct[1000],aux;
long n;

bool compare(data i,data j)
{return ((i.x-pct[1].x)*(j.y-pct[1].y)<(i.y-pct[1].y)*(j.x-pct[1].x));
}
int main()
{vector<int> stiva;
int k,i,u,w;
long min=1;

n=8;

ifstream fin("date.in");


    for(i=1;i<=n;i++)

      pct[i].ind=i;
pct[1].x=2;
pct[1].y=0;
pct[2].x=0;
pct[2].y=2;
pct[3].x=1;
pct[3].y=3;
pct[4].x=0;
pct[4].y=4;
pct[5].x=3;
pct[5].y=3;
pct[6].x=2;
pct[6].y=6;
pct[7].x=4;
pct[7].y=2;
pct[8].x=4;
pct[8].y=4;


fin.close();
    for(i=2;i<=n;i++)
       {if(pct[i].x<pct[min].x)
       min=i;}

    aux=pct[min];
    pct[min]=pct[1];
    pct[1]=aux;
    sort(pct+2,pct+n+1,compare);
    for(i=1;i<=n;i++)
      pct[i].index=i;
    stiva.push_back(0);
    stiva.push_back(pct[1].index);
    stiva.push_back(pct[2].index);
    stiva.push_back(pct[3].index);

    k=3;
    u=stiva[k-1];
    w=stiva[k];
    for(i=4;i<=n;i++)
        {while(k>2&&((pct[w].x - pct[u].x)*(pct[i].y - pct[u].y)-(pct[w].y - pct[u].y)*(pct[i].x - pct[u].x)>0))
        //(pct[u].x * pct[w].y + pct[w].x * pct[i].y + pct[i].x * pct[u].y - pct[u].y * pct[w].x - pct[w].y * pct[i].x - pct[i].y * pct[u].x)>0)
        //(pct[k].x - pct[k-1].x)*(pct[i].y - pct[k-1].y)<(pct[k].y - pct[k-1].y)*(pct[i].x - pct[k-1].x))
           {k=k-1;
            u=stiva[k-1];
            w=stiva[k];
            stiva.pop_back();

           }

         k=k+1;
         u=stiva.back();
         w=pct[i].index;
         stiva.push_back(pct[i].index);
        }
       while(stiva.back()!=0)
       {cout<<" "<<pct[stiva.back()].ind;
       stiva.pop_back();
       }


    return 1;
}