posts - 100,  comments - 15,  trackbacks - 0
#include<stdio.h>
#include
<math.h>
#include
<memory.h>
//using namespace std;
#define eps 1e-8
#define MAXN 50
#define PI 3.1415926535898
struct pointdouble x,y;};

point planet[MAXN
+1];
bool visit[MAXN+1];
int ans[MAXN+1];

double xmult(point p0,point p1,point p2){
    
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}

double dmult(point p0,point p1,point p2){
    
return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}


double distance(point p1,point p2){
    
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}


int main()
{
    
int t,indice,i,j,k,n;
    
double max;
    scanf(
"%d",&t);
    
while(t--)
    
{
        scanf(
"%d",&n);
        
for(i=1;i<=n;i++)
            scanf(
"%d%lf%lf",&indice,&(planet[i].x),&(planet[i].y));

        memset(visit,
0,sizeof(visit));

        
int next=1;

        
for(i=2;i<=n;i++)
            
if(planet[next].y>planet[i].y)
                next
=i;
            
else if(planet[next].y == planet[i].y)
                
if(planet[next].x>planet[i].x)
                    next
=i;
        point p1,p0;
        p1.x
=0;
        p1.y
=planet[next].y;
        p0.x
=planet[next].x;
        p0.y
=planet[next].y;
        k
=0;
        
double thta,max;
        
for(j=1;j<=n;j++)
        
{
            visit[next]
=true;
            ans[k
++]=next;
            max
=2*PI;
            
for(i=1;i<=n ; i++)
            
{
                
if(visit[i]) continue;    
                
double xmul=xmult(p0,p1,planet[i]);
                
double dmul=dmult(p0,p1,planet[i]);
                
if( xmul<=0)
                
{
                    
if(dmul==0 )
                        thta
=3*PI/2.0;
                    
else 
                        
if(dmul<0 ) thta=PI+atan(xmul/dmul);
                        
else  thta=2*PI+atan(xmul/dmul);

                }

                
if( thta<max || 
                    (fabs(thta
-max)<eps && fabs(distance(p0,planet[i])-distance(p0,planet[next]))<eps)
                    )
                
{ next=i;max=thta;}
            }

            p1.x
=p0.x;
            p1.y
=p0.y;
            p0.x
=planet[next].x;
            p0.y
=planet[next].y;
        }

        printf(
"%d",k);
        
for(i=0;i<k;i++)
            printf(
" %d",ans[i]);
        printf(
"\n");
    }

    
return 0;
}
posted on 2009-10-05 12:12 wyiu 阅读(105) 评论(0)  编辑 收藏 引用 所属分类: POJ

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理