POJ 1228 Grandpa's Estate(凸包)
Grandpa's Estate
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11289 Accepted: 3117 Description
Being the only living descendant of his grandfather, Kamran the Believer inherited all of the grandpa's belongings. The most valuable one was a piece of convex polygon shaped farm in the grandpa's birth village. The farm was originally separated from the neighboring farms by a thick rope hooked to some spikes (big nails) placed on the boundary of the polygon. But, when Kamran went to visit his farm, he noticed that the rope and some spikes are missing. Your task is to write a program to help Kamran decide whether the boundary of his farm can be exactly determined only by the remaining spikes.Input
The first line of the input file contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case contains an integer n (1 <= n <= 1000) which is the number of remaining spikes. Next, there are n lines, one line per spike, each containing a pair of integers which are x and y coordinates of the spike.Output
There should be one output line per test case containing YES or NO depending on whether the boundary of the farm can be uniquely determined from the input.Sample Input
1
6
0 0
1 2
3 4
2 0
2 4
5 0Sample Output
NOSource
/*************************************************************************
> File Name: poj_1228.cpp
> Author: Howe_Young
> Mail: 1013410795@qq.com
> Created Time: 2015年05月07日 星期四 16时44分36秒
************************************************************************/ #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define EPS 1e-8
using namespace std;
const int maxn = ;
struct point{
double x, y;
};
point p[maxn], convex[maxn];
double Min(double a, double b)
{
return a < b ? a : b;
}
double Max(double a, double b)
{
return a > b ? a : b;
}
int sgn(double x)
{
if (fabs(x) < EPS)
return ;
return x < ? - : ;
}
double x_multi(point p1, point p2, point p3)
{
return (p3.x - p1.x) * (p2.y - p1.y) - (p2.x - p1.x) * (p3.y - p1.y);
}
bool cmp(const point p1, const point p2)
{
return ((p1.y == p2.y && p1.x < p2.x) || p1.y < p2.y);
}
void convex_hull(point *p, point *convex, int n, int &len)
{
sort(p, p + n, cmp);
int top = ;
convex[] = p[];
convex[] = p[];
//找出凸包的下半部分凸壳
for (int i = ; i < n; i++)
{
while (top > && sgn(x_multi(convex[top - ], convex[top], p[i])) <= )//大于0为逆时针,小于0为顺时针
top--;
convex[++top] = p[i];
}
int tmp = top;
//找出凸包的上半部分,因为我的比较函数是写的y优先的,所以上下部分,当然也可以以x优先排序,这时候就是左右部分了
for (int i = n - ; i >= ; i--)
{
while (top > tmp && sgn(x_multi(convex[top - ], convex[top], p[i])) <= )//大于0为逆时针,小于0为顺时针
top--;
convex[++top] = p[i];//存放凸包中的点
}
len = top;
}
bool on_segment(point p1, point p2, point p3)//判断p3是否在线段p1p2上
{
double minx, miny, maxx, maxy;
minx = Min(p1.x, p2.x);
maxx = Max(p1.x, p2.x);
miny = Min(p1.y, p2.y);
maxy = Max(p1.y, p2.y);
return (sgn(x_multi(p1, p2, p3)) == && (sgn(p3.x - minx) >= && sgn(p3.x - maxx) <= && sgn(p3.y - miny) >= && sgn(p3.y - maxy) <= ));
}
bool check(point *p, point p1, point p2, int n)
{
int cnt = ;
for (int i = ; i < n; i++)
{
if (on_segment(p1, p2, p[i]))
cnt++;
}
if (cnt == n)//特判,如果给定的点成一条线时,不符合
return false;
return cnt >= ;
}
int main()
{
int kase, n;
scanf("%d", &kase);
while (kase--)
{
scanf("%d", &n);
for (int i = ; i < n; i++)
scanf("%lf %lf", &p[i].x, &p[i].y);
int len;
if (n <= )//n <= 5之前的点都是不确定的
{
puts("NO");
continue;
}
convex_hull(p, convex, n, len);
convex[len] = convex[];
bool flag = false;
for (int i = ; i < len; i++)//检查凸包中的每一个边
{
if (!check(p, convex[i], convex[i + ], n))
{
flag = true;
break;
}
}
if (!flag)
puts("YES");
else
puts("NO");
}
return ;
}
POJ 1228 Grandpa's Estate(凸包)的更多相关文章
- POJ 1228 Grandpa's Estate 凸包 唯一性
LINK 题意:给出一个点集,问能否够构成一个稳定凸包,即加入新点后仍然不变. 思路:对凸包的唯一性判断,对任意边判断是否存在三点及三点以上共线,如果有边不满足条件则NO,注意使用水平序,这样一来共线 ...
- POJ 1228 - Grandpa's Estate 稳定凸包
稳定凸包问题 要求每条边上至少有三个点,且对凸包上点数为1,2时要特判 巨坑无比,调了很长时间= = //POJ 1228 //稳定凸包问题,等价于每条边上至少有三个点,但对m = 1(点)和m = ...
- POJ 1228 Grandpa's Estate(凸包唯一性判断)
Description Being the only living descendant of his grandfather, Kamran the Believer inherited all o ...
- POJ 1228 Grandpa's Estate --深入理解凸包
题意: 判断凸包是否稳定. 解法: 稳定凸包每条边上至少有三个点. 这题就在于求凸包的细节了,求凸包有两种算法: 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类 ...
- 简单几何(求凸包点数) POJ 1228 Grandpa's Estate
题目传送门 题意:判断一些点的凸包能否唯一确定 分析:如果凸包边上没有其他点,那么边想象成橡皮筋,可以往外拖动,这不是唯一确定的.还有求凸包的点数<=2的情况一定不能确定. /********* ...
- poj - 1228 - Grandpa's Estate
题意:原来一个凸多边形删去一些点后剩n个点,问这个n个点能否确定原来的凸包(1 <= 测试组数t <= 10,1 <= n <= 1000). 题目链接:http://poj. ...
- 【POJ】1228 Grandpa's Estate(凸包)
http://poj.org/problem?id=1228 随便看看就能发现,凸包上的每条边必须满足,有相邻的边和它斜率相同(即共线或凸包上每个点必须一定在三点共线上) 然后愉快敲完凸包+斜率判定, ...
- 【POJ 1228】Grandpa's Estate 凸包
找到凸包后暴力枚举边进行$check$,注意凸包是一条线(或者说两条线)的情况要输出$NO$ #include<cmath> #include<cstdio> #include ...
- poj 1228 稳定凸包
Grandpa's Estate Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12337 Accepted: 3451 ...
随机推荐
- python内置字符串操作方法
1.capitalize() S.capitalize()->string 首字母大写,其余字母小写. str='A222aaA' str.capitalize()#首字母大写,其余字母小写. ...
- wlan的QOS配置
WLAN QoS配置 1.1 WLAN QoS简介 802.11网络提供了基于竞争的无线接入服务,但是不同的应用需求对于网络的要求是不同的,而原始的网络不能为不同的应用提供不同质量的接入服务,所以已 ...
- 牢记负载均衡与HA,高性能是不同的方案。一般的CLUSTER只能实现其中的一种,而ORACLE的RAC可以有两种。
F5/LVS<—Haproxy<—Squid/Varnish<—AppServer. 现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术: 第一 ...
- CSS样式中字体乱码
今天写程序时,明明设置了label标签的属性font-family:"微软雅黑"的,但是字体的显示的效果就是宋体,后来查看了一下网页源代码,结果发现设置的字体为中文的都是乱码,难怪 ...
- id有空格获取不到元素
- Qt入门(9)——Qt中的线程支持
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...
- IIS 启用或关闭目录浏览
如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. 使用 IIS 管理器启用目录浏览. 打开 IIS 管理器. 在“功能”视图中,双击“目录浏览”. 在“目录浏览”页上,在“操作”窗格中单击 ...
- trigger 触发器
--trigger --在SC表上建了一个触发器,查看inserted和deleted表中内容. create trigger tri_1 on sc for insert,update,delete ...
- hdu 4602 Partition 数学(组合-隔板法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4602 我们可以特判出n<= k的情况. 对于1<= k<n,我们可以等效为n个点排成 ...
- C基本语句测试