博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 2007--Scrambled Polygon(计算凸包,点集顺序)
阅读量:5836 次
发布时间:2019-06-18

本文共 4944 字,大约阅读时间需要 16 分钟。

Scrambled Polygon
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 10094   Accepted: 4765

Description

A closed polygon is a figure bounded by a finite number of line segments. The intersections of the bounding line segments are called the vertices of the polygon. When one starts at any vertex of a closed polygon and traverses each bounding line segment exactly once, one comes back to the starting vertex. 
A closed polygon is called convex if the line segment joining any two points of the polygon lies in the polygon. Figure 1 shows a closed polygon which is convex and one which is not convex. (Informally, a closed polygon is convex if its border doesn't have any "dents".) 
The subject of this problem is a closed convex polygon in the coordinate plane, one of whose vertices is the origin (x = 0, y = 0). Figure 2 shows an example. Such a polygon will have two properties significant for this problem. 
The first property is that the vertices of the polygon will be confined to three or fewer of the four quadrants of the coordinate plane. In the example shown in Figure 2, none of the vertices are in the second quadrant (where x < 0, y > 0). 
To describe the second property, suppose you "take a trip" around the polygon: start at (0, 0), visit all other vertices exactly once, and arrive at (0, 0). As you visit each vertex (other than (0, 0)), draw the diagonal that connects the current vertex with (0, 0), and calculate the slope of this diagonal. Then, within each quadrant, the slopes of these diagonals will form a decreasing or increasing sequence of numbers, i.e., they will be sorted. Figure 3 illustrates this point. 
 

Input

The input lists the vertices of a closed convex polygon in the plane. The number of lines in the input will be at least three but no more than 50. Each line contains the x and y coordinates of one vertex. Each x and y coordinate is an integer in the range -999..999. The vertex on the first line of the input file will be the origin, i.e., x = 0 and y = 0. Otherwise, the vertices may be in a scrambled order. Except for the origin, no vertex will be on the x-axis or the y-axis. No three vertices are colinear.

Output

The output lists the vertices of the given polygon, one vertex per line. Each vertex from the input appears exactly once in the output. The origin (0,0) is the vertex on the first line of the output. The order of vertices in the output will determine a trip taken along the polygon's border, in the counterclockwise direction. The output format for each vertex is (x,y) as shown below.

Sample Input

0 070 -5060 30-30 -5080 2050 -6090 -20-30 -40-10 -6090 10

Sample Output

(0,0)(-30,-40)(-30,-50)(-10,-60)(50,-60)(70,-50)(90,-20)(90,10)(80,20)(60,30)

Source

 
这道题用卷包裹法过不去啊,仔细看题发现要逆时针输出,于是换成扫描法就过了。。。Orz
Graham求完的凸包点集依次出栈可以得到从起点开始顺时针旋转的所有凸包上的点。
 
1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 const int maxn = 1001; 7 typedef struct point { 8 double x, y; 9 point() {10 11 }12 point(double a, double b) {13 x = a;14 y = b;15 }16 point operator -(const point &b) const{17 return point(x - b.x, y - b.x);18 }19 double operator *(const point &b)const {20 return x*b.x + y*b.y;21 } 22 }point;23 point p[maxn];24 int n=0, res[maxn];25 int top;//top模拟栈顶26 bool cmp(point a, point b) {27 if (a.y == b.y) return a.x < b.x;28 return a.y < b.y;29 }30 bool multi(point p1, point p2, point p0) { //判断p1p0和p2p0的关系,<0,p1p0在p2p0的逆时针方向,>0,p1p0在p2p0的顺时针方向31 return (p1.x - p0.x)*(p2.y - p0.y) >= (p2.x - p0.x)*(p1.y - p0.y);32 }33 void Graham(){34 int i, len;//top模拟栈顶35 sort(p, p + n, cmp);36 top = 1;37 //少于3个点也就没有办法形成凸包38 if (n == 0)return; res[0] = 0;39 if (n == 1)return; res[1] = 1;40 if (n == 2)return; res[2] = 2;41 for (i = 2; i < n; i++) {42 while (top&&multi(p[i], p[res[top]], p[res[top - 1]])) //如果当前这个点和栈顶两个点构成折线右拐了,就回溯到上一个点43 top--; //弹出栈顶44 res[++top] = i; //否则将这个点入栈45 }46 len = top;47 res[++top] = n - 2;48 for (i = n - 3; i >= 0; i--) {49 while (top!=len&&multi(p[i], p[res[top]], p[res[top - 1]]))50 top--;51 res[++top] = i;52 }53 }54 int main(void) {55 int i, s;//s为起点坐标56 while (scanf("%lf%lf", &p[n].x, &p[n].y)!=EOF)n++;57 Graham();58 for (s = 0; s < top; s++) {59 if (!p[res[s]].x && !p[res[s]].y) //找到原点60 break;61 }62 for (i = s; i < top; i++) {63 printf("(%.lf,%.lf)\n",p[res[i]].x, p[res[i]].y);64 }65 for (i = 0; i < s; i++) {66 printf("(%.lf,%.lf)\n", p[res[i]].x, p[res[i]].y);67 }68 return 0;69 }
View Code

 

转载于:https://www.cnblogs.com/FlyerBird/p/9471181.html

你可能感兴趣的文章
MongoDB CookBook读书笔记之导入导出
查看>>
shell如何快速锁定所有账号
查看>>
HTML 5实现的手机摇一摇
查看>>
此博客不再发表对自己私事的看法
查看>>
导致Asp.Net站点重启的10个原因
查看>>
【PMP】Head First PMP 学习笔记 第一章 引言
查看>>
抓住云机遇编排工作 搞定复杂IT工作流
查看>>
MYSQL的longtext字段能放多少数据?
查看>>
MTK 平台上如何给 camera 添加一种 preview size
查看>>
云计算最大难处
查看>>
关于数据分析思路的4点心得
查看>>
Memcached安装与配置
查看>>
美团数据仓库的演进
查看>>
SAP被评为“大数据”预测分析领军企业
查看>>
联想企业网盘张跃华:让文件创造业务价值
查看>>
记录一次蚂蚁金服前端电话面试
查看>>
直播源码开发视频直播平台,不得不了解的流程
查看>>
Ubuntu上的pycrypto给出了编译器错误
查看>>
聊聊flink的RestClientConfiguration
查看>>
在CentOS上搭建git仓库服务器以及mac端进行克隆和提交到远程git仓库
查看>>