//某一赛区题,poj题目链接:http://poj.org/problem?id=1696
//题意:在一个平面内给出N个点,每两点之间没有相同的x或y,
//求从y最小的一点开始,每次都向左移动,能有多少点符合并求出点对应的下标(要求路线不相交)。
//解题思路:第一个点是y最小的点,重点在第二个点要找哪个点,就是x轴正方向夹角最小的点;
//再用点积,叉积和夹角,找出其它的点
//0ms AC 代码如下:
#include<iostream>
#include<cstdio>
#include<math.h>
#define eps 1e-8
struct point {int index;double x,y;}p[52];
bool zero(double x)
{
return x>0.0 ? x<eps:x>-eps;
}
double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double dmult(point p1,point p2,point p0)
{
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));
}
double angle(point p1,point p2,point p0)
{
double a=distance(p1,p0);
double b=distance(p2,p0);
double c=distance(p1,p2);
return (a*a+b*b-c*c)/(2*a*b);
}
int f[52];
point s,e;
int ans[52];
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{
int n;
int i,j;
scanf("%d",&n);
int miny=1,secend=1;
for(i=1;i<=n;i++)
{
scanf("%d%lf%lf",&p[i].index,&p[i].x,&p[i].y);
f[i]=0;
}
if(n==1)
{
printf("1 1\n");
continue;
}
for(i=1;i<=n;i++)
{
if(p[miny].y>p[i].y)miny=i;
}
double judge=-1;
for(i=1;i<=n;i++)
{
if(i!=miny)
{
point t;
t.x=p[miny].x+100;//
t.y=p[miny].y;
double temp=angle(p[i],t,p[miny]);
if(temp-judge>0.0)
{secend=i;
judge=temp;
}
}
}
s=p[p[miny].index];
e=p[p[secend].index];
f[p[miny].index]=1;
f[p[secend].index]=1;
ans[0]=p[miny].index;
ans[1]=p[secend].index;
int cnt=2;
for(i=3;i<=n;i++)
{
int index=0;
double xmu=1000000.0;
double minAng=1.0;
bool flag=false;
for(j=1;j<=n;j++)
{
if(!f[j])
{
double temp=xmult(p[j],s,e);
double ang=angle(p[j],s,e);
double dx=dmult(p[j],s,e);
if(temp>0.0||temp==0.0&&dx<0.0)
{
if(ang-minAng<0.0)
{
index=j;
minAng=ang;
}
}
}
}
if(index!=ans[cnt-1])
{
ans[cnt++]=p[index].index;
f[p[index].index]=1;
s=e;
e=p[index];
f[index]=1;
}
}
printf("%d",cnt);
for(i=0;i<cnt;i++)
{
printf("% d",ans[i]);
}
printf("\n");
}
return 0;
}
分享到:
相关推荐
北大POJ1696-Space Ant 解题报告+AC代码
NULL 博文链接:https://128kj.iteye.com/blog/1750462
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
北大POJ2031-Building a Space Station【Prim+计算几何】 POJ2031-Building a Space Station【Prim+计算几何】
POJ 最接近点对问题 ACM北大 using namespace std; struct Point { float x; float y; };
北大POJ2002-Squares 解题报告+AC代码
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj分类poj分类poj分类poj分类
北大POJ1159-Palindrome 解题报告+AC代码
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
POJ1048,加强版的约瑟夫问题 难度中等
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 百练 题目分类 poj 百练 题目分类
poj 1001答案