向左走
题意:
将点的坐标按y轴从小到大输出,如果y相同就按x从小到大输出
思路:
1.输入的时候先找到起点
2.然后依次找后面俩个点,如果后面俩个点的顺序不符合,则交换
3.判断点的顺序可以用差积来实现
代码:
#include <iostream> #include <cmath> using namespace std; const int N=1010; struct Point { int id,x,y; }p[N]; int cross(Point a,Point b,Point c) { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } int dist(Point a,Point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } bool check(Point a,Point b,Point c) { if(cross(a,b,c)>0 || (cross(a,b,c)==0 && dist(a,c)<dist(b,c))) return true; return false; } int main() { int n; while(scanf("%d",&n)!=-1) { for(int i=0;i<n;i++) { scanf("%d%d%d",&p[i].id,&p[i].x,&p[i].y); if(p[i].y<p[0].y || (p[i].y==p[0].y && p[i].x<p[0].x)) swap(p[i],p[0]); } for(int i=0;i<n;i++) { for(int j=i+2;j<n;j++) { if(check(p[j],p[i+1],p[i])) swap(p[j],p[i+1]); } } for(int i=0;i<n-1;i++) printf("%d ",p[i].id); printf("%d\n",p[n-1].id); } }