您的位置:首页 > 其它

poj 1696(极角排序)

2016-05-02 20:35 399 查看
题目让找出一条最长的非右拐的路径。

这道题类似于凸包的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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  计算几何