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 ...
随机推荐
- 谈谈android 布局 的优化
来自:http://www.cnblogs.com/youxilua/archive/2012/05/08/2489414.html 导言 设配android的屏幕一定是一个噩梦,就好比那些搞网页设计 ...
- PHP学习之中数组-遍历一维数组【2】
在PHP学习之中数组[1]中学会怎么创建一个数组,如果PHP学习之中数组[1]中的元素多的话,我们访问元素又是一个问题了,下面我们就使用for语句while,foreach来遍历我们的数组: < ...
- javascript深入理解js闭包[转]
一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...
- MS Writer Code Test
#include<iostream> using namepspace std; int main() { cout<<"Hello World"<& ...
- Lambda表达式中的表达式lambda和语句lambda区别
Lambda表达式可分为表达式lambda和语句lambda 表达式lambda:表达式位于 => 运算符右侧的lambda表达式称为表达式lambda (input parameters) = ...
- 实战EntityFramework
删除对象一定要在同一个context 我尝试这在两个方法中使用两个context(Container)实例来进行一个获得一个删除,结果我获得的”The object cannot be deleted ...
- 关于移动手机端富文本编辑器qeditor图片上传改造
日前项目需要在移动端增加富文本编辑,上网找了下,大多数都是针对pc版的,不太兼容手机,当然由于手机屏幕小等原因也限制富文本编辑器的众多强大功能,所以要找的编辑器功能必须是精简的. 找了好久,发现qed ...
- Oralce 字符串截取
update E_SYS_STRATEGY set sconfigvalue=(select Substr((select sconfigvalue from E_SYS_STRATEGY where ...
- Unity 网络斗地主 牌的一些算法
Unity 网络斗地主 牌的一些算法 在这儿说一下,我的项目是用svn的方式,上传在https://v2.svnspot.com/18666451713.doudizhu这个svn上,大家可以下载T ...
- cf C. Dominoes
http://codeforces.com/contest/394/problem/C 题意:有n*m个骨牌,每个骨牌上有四种样式(“01,10,11,00”),让你重新排列成一个N*M的矩阵,使2* ...