poj 1584(综合性强的计算几何,好题)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 6238 | Accepted: 1997 |
Description
A recent factory run of computer desks were flawed when an automatic
grinding machine was mis-programmed. The result is an irregularly
shaped hole in one piece that, instead of the expected circular shape,
is actually an irregular polygon. You need to figure out whether the
desks need to be scrapped or if they can be salvaged by filling a part
of the hole with a mixture of wood shavings and glue.
There are two concerns. First, if the hole contains any protrusions
(i.e., if there exist any two interior points in the hole that, if
connected by a line segment, that segment would cross one or more edges
of the hole), then the filled-in-hole would not be structurally sound
enough to support the peg under normal stress as the furniture is used.
Second, assuming the hole is appropriately shaped, it must be big enough
to allow insertion of the peg. Since the hole in this piece of wood
must match up with a corresponding hole in other pieces, the precise
location where the peg must fit is known.
Write a program to accept descriptions of pegs and polygonal holes
and determine if the hole is ill-formed and, if not, whether the peg
will fit at the desired location. Each hole is described as a polygon
with vertices (x1, y1), (x2, y2), . . . , (xn, yn). The edges of the
polygon are (xi, yi) to (xi+1, yi+1) for i = 1 . . . n − 1 and (xn, yn) to (x1, y1).
Input
Line 1 < nVertices > < pegRadius > < pegX > < pegY >
number of vertices in polygon, n (integer)
radius of peg (real)
X and Y position of peg (real)
n Lines < vertexX > < vertexY >
On a line for each vertex, listed in order, the X and Y position of
vertex The end of input is indicated by a number of polygon vertices
less than 3.
Output
HOLE IS ILL-FORMED if the hole contains protrusions
PEG WILL FIT if the hole contains no protrusions and the peg fits in the hole at the indicated position
PEG WILL NOT FIT if the hole contains no protrusions but the peg will not fit in the hole at the indicated position
Sample Input
5 1.5 1.5 2.0
1.0 1.0
2.0 2.0
1.75 2.0
1.0 3.0
0.0 2.0
5 1.5 1.5 2.0
1.0 1.0
2.0 2.0
1.75 2.5
1.0 3.0
0.0 2.0
1
Sample Output
HOLE IS ILL-FORMED
PEG WILL NOT FIT 这篇博客有测试数据:http://blog.csdn.net/lyy289065406/article/details/6648606
题意:输入n个点,圆的半径以及圆的坐标X,Y。然后是每个点的x,y坐标.
判断输入的点是不是能够组成凸包,不能的话输出 HOLE IS ILL-FORMED,判断圆是否在凸包内.如果在的话输出PEG WILL FIT.否则输出 PEG WILL NOT FIT
很多模板的综合应用.
这个题判断点是否在多边形内有两种模板:
一种局限性大,只适合按照顺(逆)时针输入的凸多边形,不过很容易理解:
/**判断点是否在凸多边形内(这个比较容易打并且适合这题)*/
bool pointInConvex(int n,double x,double y){
Point po;
p[n] = p[];
po.x = x,po.y = y;
bool flag = isCross(cross(p[],p[],po)); ///既然是判断了是凸多边形肯定相邻两个点是朝同一个方向转
for(int i=;i<n;i++){
if(isCross(cross(p[i],p[i+],po))!=flag){
return false;
}
}
return true;
}
另外一种具有普遍性,什么样子的多边形都OK,大牛总结的:
/**判断点是否在多边形内(具有普遍性,不过并不能看懂)*/
bool pointInPolygon(int n,double x,double y)
{
int i,j=n-;
bool oddNodes=;
for (i=; i<n; i++)
{
if((p[i].y< y && p[j].y>=y|| p[j].y<y && p[i].y>=y) && (p[i].x<=x||p[j].x<=x))
{
oddNodes^=(p[i].x+(y-p[i].y)/(p[j].y-p[i].y)*(p[j].x-p[i].x)<x);
}
j=i;
}
return oddNodes;
}
代码:
///题意:输入n个点,圆的半径以及圆的坐标X,Y。
///先是判断输入的点是不是能够组成凸包(这里的判断就是所有的点是不是往同一个方向"拐")
///然后判断圆心是否在凸包内.如果在的话就判断圆心的和凸包每条边的就离是否小于R。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int N = ;
const double eps = 1e-;
struct Point
{
double x,y;
} p[N];
Point c; ///圆心
double r; ///圆的半径
int n;
/**计算叉积*/
double cross(Point a,Point b,Point c)
{
return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
/**判断叉积正负*/
int isCross(double k)
{
if(k<) return ;
return ;
}
/**是否为凸包*/
bool isConvex(int n)
{
p[n++]=p[];
p[n++]=p[];
int dir = isCross(cross(p[],p[],p[]));
for(int i=; i<n; i++)
{
if(isCross(cross(p[i-],p[i],p[i-]))!=dir)
{
return false;
}
}
return true;
}
/**判断点是否在多边形内(具有普遍性,不过并不能看懂)*/
bool pointInPolygon(int n,double x,double y)
{
int i,j=n-;
bool oddNodes=;
for (i=; i<n; i++)
{
if((p[i].y< y && p[j].y>=y|| p[j].y<y && p[i].y>=y) && (p[i].x<=x||p[j].x<=x))
{
oddNodes^=(p[i].x+(y-p[i].y)/(p[j].y-p[i].y)*(p[j].x-p[i].x)<x);
}
j=i;
}
return oddNodes;
}
/**判断点是否在凸多边形内(这个比较容易打并且适合这题)*/
bool pointInConvex(int n,double x,double y){
Point po;
p[n] = p[];
po.x = x,po.y = y;
bool flag = isCross(cross(p[],p[],po)); ///既然是判断了是凸多边形肯定相邻两个点是朝同一个方向转
for(int i=;i<n;i++){
if(isCross(cross(p[i],p[i+],po))!=flag){
return false;
}
}
return true;
}
///点积
double mult(Point a,Point b,Point c){
return (a.x-c.x)*(b.x-c.x)+(a.y-c.y)*(b.y-c.y);
}
///距离
double dis(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
///点c到线段ab的最短距离
double GetDist(Point a,Point b,Point c){
if(dis(a,b)<eps) return dis(b,c); ///a,b是同一个点
if(mult(b,c,a)<-eps) return dis(a,c); ///投影
if(mult(a,c,b)<-eps) return dis(b,c);
return fabs(cross(b,c,a)/dis(a,b)); }
/**判断圆是否在凸多边形内*/
bool circleInConvex(int n,double x,double y,double r){
Point po;
po.x = x,po.y = y;
p[n]=p[];
for(int i=;i<n;i++){
if(r>GetDist(p[i],p[i+],po)){
return false;
}
}
return true;
}
int main()
{
while(scanf("%d",&n)!=EOF&&n>=)
{
scanf("%lf%lf%lf",&r,&c.x,&c.y);
for(int i=; i<n; i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
}
if(!isConvex(n)) printf("HOLE IS ILL-FORMED\n");
else if(!circleInConvex(n,c.x,c.y,r)||!pointInConvex(n,c.x,c.y)){
printf("PEG WILL NOT FIT\n");
}else printf("PEG WILL FIT\n"); }
return ;
}
poj 1584(综合性强的计算几何,好题)的更多相关文章
- POJ 1061 青蛙的约会 数论水题
http://poj.org/problem?id=1061 傻逼题不多说 (x+km) - (y+kn) = dL 求k 令b = n-m ; a = x - y ; 化成模线性方程一般式 : Lx ...
- POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内
首先判断是不是凸多边形 然后判断圆是否在凸多边形内 不知道给出的点是顺时针还是逆时针,所以用判断是否在多边形内的模板,不用是否在凸多边形内的模板 POJ 1584 A Round Peg in a G ...
- POJ P2318 TOYS与POJ P1269 Intersecting Lines——计算几何入门题两道
rt,计算几何入门: TOYS Calculate the number of toys that land in each bin of a partitioned toy box. Mom and ...
- POJ 1584 A Round Peg in a Ground Hole【计算几何=_=你值得一虐】
链接: http://poj.org/problem?id=1584 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ...
- POJ 1584 计算几何
思路: 求一遍凸包 用三角形面积(叉积求一下)/边长 求出来高,跟半径比一比 坑点:凸包上三点共线 //By SiriusRen #include <cmath> #include < ...
- 2018.07.04 POJ 1654 Area(简单计算几何)
Area Time Limit: 1000MS Memory Limit: 10000K Description You are going to compute the area of a spec ...
- POJ 1066 Treasure Hunt(计算几何)
题意:给出一个100*100的正方形区域,通过若干连接区域边界的线段将正方形区域分割为多个不规则多边形小区域,然后给出宝藏位置,要求从区域外部开辟到宝藏所在位置的一条路径,使得开辟路径所需要打通的墙壁 ...
- POJ 2398 Toy Storage(计算几何,叉积判断点和线段的关系)
Toy Storage Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3146 Accepted: 1798 Descr ...
- hdu 4720 计算几何简单题
昨天用vim练了一道大水题,今天特地找了道稍难一点的题.不过也不是很难,简单的计算几何而已.练习用vim编码,用gdb调试,结果居然1A了,没调试...囧... 做法很简单,无非就是两种情况:①三个巫 ...
随机推荐
- oracle ocp 052考试学习
1.数据字典存储在SYSTEM表空间中. 2.SYSAUX可以offline: SQL>alter tablespace sysaux offline; 3.SYSTEM和SYSAUX都是永久表 ...
- linux cfs 负载均衡
确定新的负载的时候,代码中给出的公式是: (old×(2^i-1) + new))/2^i 整理下来是: old + (new-old)/2^i i的范围是[1, 4],也就是说,i的层级越高,那么n ...
- iOS-数据持久化之Sqllite
iOS中的数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding(NSKeyedArchiver\NSk ...
- [Leetcode] Longest consecutive sequence 最长连续序列
Given an unsorted array of integers, find the length of the longest consecutive elements sequence. F ...
- 洛谷 P2480 [SDOI2010]古代猪文 解题报告
P2480 [SDOI2010]古代猪文 题目背景 "在那山的那边海的那边有一群小肥猪.他们活泼又聪明,他们调皮又灵敏.他们自由自在生活在那绿色的大草坪,他们善良勇敢相互都关心--" ...
- HDOJ.2064 汉诺塔III
汉诺塔III Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 适用于iview的表格转Excel插件
在网上找的一个表格转excel插件,经过修改后使其适用于iview中的table组件 let idTmr; const getExplorer = () => { let explorer = ...
- codeforces 792CDivide by Three(两种方法:模拟、动态规划
传送门:https://codeforces.com/problemset/problem/792/C 题意:给你一个字符串,要求让你删除最少个数的元素,使得最终答案是没有前导0并且是3的倍数. 题解 ...
- Ubuntu 12.04更新源(转)
1.首先备份Ubuntu12.04源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup (备份下当前的源列表) 2.修改更新源 ...
- IntelliJ IDEA2017 + Tomcat 设置热部署
1.点击idea中tomcat设置 2.点击deployment查看Deploy at the server startup 中tomcat每次所运行的包是 xxxx:war 还是其他,如果是xxxx ...