news 2026/6/25 17:25:35

UVa 596 The Incredible Hull

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
UVa 596 The Incredible Hull

题目描述

题目要求计算多个简单多边形的点集的凸包,并输出凸包的顶点。凸包顶点按逆时针顺序输出,起始点为xxx坐标最大的点(若相同取yyy最小的)。输出时保留所有共线的凸包顶点(即不删除共线点)。

输入格式

输入包含多行。每行以SPEND开头。S开始一个新集合,后跟集合标识符。P定义一个多边形,后跟顶点数及坐标。END为最后一行。

输出格式

对于每个集合,输出一行标识符convex hull:,然后一行输出凸包顶点坐标,格式如(x,y),顶点之间用空格分隔。

样例

输入

S Sample 1 P 5 8 0 8 8 0 8 5 6 2 3 P 3 6 13 2 18 2 13 P 4 15 6 15 14 10 14 10 6 S Sample 2 P 8 1 2 -3 5 1 8 -3 12 -7 8 -3 5 -7 2 -3 -2 S Sample 3 P 4 150 100 150 150 100 150 100 100 P 4 180 130 180 180 130 180 130 130 S Sample 4 P 4 20 5 10 10 0 5 10 0 P 4 20 20 10 25 0 20 10 15 P 4 20 35 10 40 0 35 10 30 END

输出

Sample 1 convex hull: (15,6) (15,14) (2,18) (0,8) (2,3) (8,0) Sample 2 convex hull: (1,2) (1,8) (-3,12) (-7,8) (-7,2) (-3,-2) Sample 3 convex hull: (180,130) (180,180) (130,180) (100,150) (100,100) (150,100) Sample 4 convex hull: (20,5) (20,20) (20,35) (10,40) (0,35) (0,20) (0,5) (10,0)

题目分析

本题的核心是计算点集的凸包,并保留共线点。可以使用Graham\texttt{Graham}Graham扫描法或Jarvis\texttt{Jarvis}Jarvis步进法。

算法

  • 收集所有多边形的顶点,去重。
  • 使用Jarvis\texttt{Jarvis}Jarvis步进法(礼品包装法)求凸包。在共线时,选择距离当前点最近的点,以保留所有共线顶点。
  • 找到xxx最大(若相同则yyy最小)的点作为起始点,然后按逆时针顺序输出。

复杂度分析

顶点数≤20×20=400\le 20 \times 20 = 40020×20=400Jarvis\texttt{Jarvis}JarvisO(nh)O(nh)O(nh)可接受。

代码实现

// The Incredible Hull// UVa ID: 596// Verdict: Accepted// Submission Date: 2016-08-13// UVa Run Time: 0.000s//// 版权所有(C)2016,邱秋。metaphysis # yeah dot net#include<bits/stdc++.h>usingnamespacestd;constintMAX_VERTICES=500;structpoint{intx,y;booloperator<(constpoint&another)const{if(x!=another.x)returnx<another.x;elsereturny<another.y;}booloperator==(constpoint&another)const{returnx==another.x&&y==another.y;}};structpolygon{intvertexNumber;point vertex[MAX_VERTICES];};point vertex[MAX_VERTICES];intvertexPerObject,vertexOfTotal=0;// 叉积,判断点a,b,c组成的两条线段的转折方向。当叉积大于0,则形成一个右拐,否则共线(cp = 0)或左拐(cp < 0)intcp(point a,point b,point c){return(b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);}// 从点a向点b望去,点c位于线段ab的右侧,返回trueboolcw(point a,point b,point c){returncp(a,b,c)<0;}// 从点a向点b望去,点c位于线段ab的左侧时,返回trueboolccw(point a,point b,point c){returncp(a,b,c)>0;}// 当三点共线时,返回trueboolcollinear(point a,point b,point c){returnabs(cp(a,b,c))==0;}intdistanceOfPoint(point a,point b){returnpow(a.x-b.x,2)+pow(a.y-b.y,2);}// Jarvis步进法求凸包voidjarvisConvexHull(){polygon pg;pg.vertexNumber=0;// 去掉重合点// 得到位置处于最左的点,当有共线情况存在时,取y坐标最小的,该顶点定为凸包上的顶点sort(vertex,vertex+vertexOfTotal);vertexOfTotal=unique(vertex,vertex+vertexOfTotal)-vertex;intcurrent=0,visited[MAX_VERTICES];memset(visited,0,sizeof(visited));do{// 寻找凸包的下一个候选顶点// 测试点current,next,i是否构成一个右转,或者共线// 当构成右转时,说明点i比next相对于current有更小的极角,应该将当前的待选凸包点更新为点i// 当共线时,因为题意要求输出共线的凸包顶点,故选择距离当前凸包点current更近的点intnext=0;for(inti=1;i<vertexOfTotal;i++){if(!visited[i]&&(cw(vertex[current],vertex[next],vertex[i])||distanceOfPoint(vertex[current],vertex[next])==0||(collinear(vertex[current],vertex[next],vertex[i])&&(distanceOfPoint(vertex[current],vertex[i])<distanceOfPoint(vertex[current],vertex[next])))))next=i;}// 将点next加入凸包pg.vertex[pg.vertexNumber++]=vertex[next];visited[next]=1;current=next;}while(current!=0);intselected=0;for(inti=0;i<pg.vertexNumber;i++)if(pg.vertex[i].x>pg.vertex[selected].x||(pg.vertex[i].x==pg.vertex[selected].x&&pg.vertex[i].y<pg.vertex[selected].y))selected=i;for(inti=selected;i<pg.vertexNumber+selected;i++)cout<<" ("<<pg.vertex[i%pg.vertexNumber].x<<','<<pg.vertex[i%pg.vertexNumber].y<<')';cout<<'\n';}intmain(){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);charstart;while(cin>>start,start!='E'){string description;getline(cin,description);if(description.front()==' ')description.erase(description.begin());cout<<description<<" convex hull:\n";vertexOfTotal=0;while(cin>>start,start=='P'){cin>>vertexPerObject;for(inti=0;i<vertexPerObject;i++){cin>>vertex[vertexOfTotal].x>>vertex[vertexOfTotal].y;vertexOfTotal++;}}jarvisConvexHull();cin.putback(start);}return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/25 17:25:29

主机厂审核员最在意的事:通孔背面毛刺,你靠什么控制?

做汽车零部件机加工的都清楚——主机厂SQE来现场&#xff0c;常会盯住去毛刺工序问&#xff1a;• "背面毛刺深度怎么保持一致&#xff1f;"• "金属碎屑会不会残留在油道影响清洁度&#xff1f;"- "这道工序的过程能力数据有吗&#xff1f;"手工…

作者头像 李华
网站建设 2026/6/25 17:24:31

线性回归实战:从直觉预测到可解释AI模型

1. 线性回归到底是什么&#xff1f;别被“算法”俩字吓住&#xff0c;它其实就是你每天都在用的“找规律”本能我带过不少刚转行做数据分析的朋友&#xff0c;头三天聊得最多的一句话是&#xff1a;“线性回归听起来好高级&#xff0c;可我连公式都看不下去。”其实真不是你数学…

作者头像 李华
网站建设 2026/6/25 17:23:12

GPT-3范式迁移:从微调到提示驱动的NLP革命

1. 这不是升级&#xff0c;是范式迁移&#xff1a;GPT-3凭什么让整个NLP圈集体失语&#xff1f;2020年5月&#xff0c;OpenAI那篇题为《Language Models are Few-Shot Learners》的论文刚一公开&#xff0c;我正在调试一个用BERT微调的客服意图识别模型&#xff0c;团队里三个算…

作者头像 李华
网站建设 2026/6/25 17:18:47

写 EF Core 查询,90% 的人第一步就错了:刚子教你避开所有坑

今天刚子不跟你扯理论&#xff0c;直接上实战代码&#xff0c;把 EF Core 复杂查询的几个核心技巧给你讲明白。顺便聊聊性能优化的几条铁律&#xff0c;省得你下次再踩坑。 先说核心&#xff1a;EF Core 复杂查询的3个核心技巧 处理复杂查询&#xff0c;你只需要记住这几招&am…

作者头像 李华
网站建设 2026/6/25 17:18:45

Python多核并发实战:绕过GIL的4种生产级方案

Python 3.14 并不存在——截至2024年&#xff0c;CPython 官方最新稳定版本是3.12.6&#xff08;2024年8月发布&#xff09;&#xff0c;3.13 正处于 beta 阶段&#xff08;预计2024年10月正式发布&#xff09;&#xff0c;而3.14 尚未进入官方开发路线图&#xff0c;也未在 py…

作者头像 李华