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");
}
}
这道题类似于凸包的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");
}
}
相关文章推荐
- 初学算法 - 求凸包的Garham's Scan算法的C++实现
- 【Google Code Jam 2009 round2 problem D】Watering Plants (两圆交点求法详解)
- 计算几何模板
- 计算几何小模板
- BZOJ2829信用卡凸包
- HDU 4922 Hello, Your Package! (计算几何+DP)(WA)
- poj 1514&zoj 1185 Metal Cutting(半平面交)
- UVA 10969 Sweet Dream(圆的相交)
- uva 11177 Fighting Against a Polygonal Monster(凸包与圆的面积交)
- POJ1279 && LA2512 Art Gallery(求多边形的核)
- poj 2540 && uva 10084 Hotter Colder(半平面交)
- UVALive 5878 - Shortest Leash 【计算几何】
- 【计算几何】POJ 2318 & POJ 2398
- 【计算几何】POJ 2653
- 【计算几何】POJ 1113
- HDU 5128 The E-pang Palace
- POJ 2318 TOYS(叉积+二分or暴力)
- POJ 2398 Toy Storage(叉积+二分)
- POJ 1228 Grandpa's Estate 计算凸包+判断点在线段上
- POJ 1873 The Fortified Forest 计算凸包