POJ 1696/hrbustoj 1318 几何 蛋疼的蚂蚁

来源:互联网 发布:c语言swich case 编辑:程序博客网 时间:2024/04/29 09:29

链接:POJ(英文):http://poj.org/problem?id=1696

           hrbustoj(中文):http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1318

分析:逆时针极角排序(除了第一个点对y排序)

#include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cstdio>#include<cmath>#include<iomanip>using namespace std;const int maxn=100000;struct point{    int u;    int x, y;    void read(){        cin>>u>>x>>y;    }}f[105],cur;bool cmp_y(point a,point b){///对y排序    return a.y<b.y;}double cross(point p0,point p1,point p2){///两向量叉积    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}double dis(point a,point b){///两点距离    return sqrt(double((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));}bool cmp(point a,point b){///极角排序    double ret = cross(cur,a,b);    if(ret>0) return true;    if(ret<0) return false;    double x = dis(cur,a);    double y = dis(cur,b);    if(x<y) return true;///a靠得近    return false;}int main(){    int T; cin>>T;    while(T--){        int n; cin>>n;        for(int i=0;i<n;++i)            f[i].read();        for(int i=0;i<n;++i){            if(!i)sort(f+i,f+n,cmp_y);            else  sort(f+i,f+n,cmp);            cur = f[i];            if(!i)cout<<n;            cout<<' '<<f[i].u;        }        cout<<endl;    }    return 0;}


原创粉丝点击