题目让找出一条最长的非右拐的路径。
这道题类似于凸包的Graham扫描法,依次对某点进行极角的排序。
参考博客:http://blog.csdn.net/zhengnanlee/article/details/9501685
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
struct Point
{
int x, y, num;
};
Point p[55], res[55];
int pos;
int cross(Point p0, Point p1, Point p2)
{
return (p1.x - p0.x)*(p2.y - p0.y) - (p2.x - p0.x)*(p1.y - p0.y);
}
int Distance(Point p1, Point p2)
{
return (p2.x - p1.x)*(p2.x - p1.x) + (p2.y - p1.y)*(p2.y - p1.y);
}
bool cmp(const Point & p1, const Point & p2)
{
int temp;
temp = cross(p[pos], p1, p2);
if (temp > 0)
{
return true;
}
else if (temp == 0 && Distance(p[pos], p1) < Distance(p[pos], p2))
{
return true;
}
return false;
}
int main()
{
int ncase;
cin >> ncase;
while (ncase--)
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin>>p[i].num>>p[i].x>>p[i].y;
if (p[i].y < p[0].y)
{
swap(p[0], p[i]);
}
}
int j = pos = 0;
sort(p + 1, p + n, cmp);
res[j++] = p[pos++];
for (int i = 2; i < n; i++)
{
sort(p + pos, p + n, cmp);
res[j++] = p[pos++];
}
res[j++] = p[pos++];
printf("%d", j);
for (int i = 0; i < j; i++)
{
printf(" %d", res[i].num);
}
printf("\n");
}
}