Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
凸包——卷包裹法选择一个最靠边缘(按x,y排序)的点,每次用叉积算出相对于上一个点最靠右的点,如果没有可选的点或者最靠右的点被选过了,退出 贴代码: #define GM pair<double,double> using namespace std; const int NMax=1100; const double PI=3.14159265358979; int N; double L; GM A[NMax]; bool F[NMax]; queue<int> Q; bool cmp(GM a,GM b) { return a.second<b.second || (a.second==b.second && a.first<b.first); } double cross(GM c,GM a,GM b) { return (c.first-a.first)*(a.second-b.second)-(c.second-a.second)*(a.first-b.first); } int main() { scanf("%d%lf",&N,&L); for(int i=1;i<=N;i++) scanf("%lf%lf",&(A[i].first),&(A[i].second)); sort(A+1,A+N+1,cmp); F[1]=1; int last=1; while(1) { int Minn=-1; for(int i=1;i<=N;i++) if(!F[i]) { Minn=i; break; } if(Minn==-1) break; for(int i=1;i<=N;i++) if(cross(A[last],A[i],A[Minn])>0) Minn=i; if(F[Minn]) break; Q.push(Minn),F[Minn]=1,last=Minn; } double ans=PI*2*L; last=1; while(!Q.empty()) { int tmp=Q.front(); Q.pop(); ans+=sqrt((A[last].first-A[tmp].first)*(A[last].first-A[tmp].first) +(A[last].second-A[tmp].second)*(A[last].second-A[tmp].second)); last=tmp; } ans+=sqrt((A[last].first-A[1].first)*(A[last].first-A[1].first) +(A[last].second-A[1].second)*(A[last].second-A[1].second)); cout.setf(ios::fixed); cout.precision(0); cout<<ans<<endl; getchar();getchar(); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator