POJ 1228 Grandpa's Estate
2016-08-09 18:42
113 查看
NO的两种可能:
1. 一条直线。
2.一条线上直有两个点。//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/9.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define EPS 1e-6
#define PI acos(-1)
struct Point{
double x,y;
Point(double x,double y): x(x),y(y) {}
};
struct Vector{
double x,y;
Vector(double x,double y): x(x),y(y) {}
};
Vector operator - (Point p,Point q)
{
return Vector(p.x-q.x,p.y-q.y);
}
int sign(double x)
{
return fabs(x)<EPS?0:x>0?1:-1;
}
double cross(Vector p,Vector q)
{
return p.x*q.y-p.y*q.x;
}
bool cmp(Point p,Point q)
{
if(p.x<q.x) return true;
else if(p.x-q.x) return false;
else return p.y<q.y;
}
void Graham(vector<Point> &points,vector<Point> &stack)
{
stack.clear();
sort(points.begin(),points.end(),cmp);
stack.push_back(points[0]);
stack.push_back(points[1]);
for(int i=2;i<points.size();i++)
{
while(stack.size()>1)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
int size=(int)stack.size();
stack.push_back(points[(int)points.size()-2]);
for(int i=(int)points.size()-3;i>=0;i--)
{
while(stack.size()>size)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
}
void check(vector<Point> stack)
{
int len;
len=(int)stack.size();
int i=0,j;
while(i<len-1)
{
for(j=i+1;j<len;j++)
{
Point k1=stack[i];
Point k2=stack[j];
if(j+1>=len) break;
Point k3=stack[j+1];
if(sign(cross(k2-k1,k3-k1))!=0) break;
}
if(j-i<=1||j-i+1==len) {printf("NO\n");return ;}
i=j;
}
printf("YES\n");
}
int main()
{
int t,n;
double x,y;
vector<Point> points;
vector<Point> stack;
scanf("%d",&t);
while(t--)
{
points.clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&x,&y);
points.push_back(Point(x,y));
}
Graham(points,stack);
check(stack);
}
return 0;
}
1. 一条直线。
2.一条线上直有两个点。//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/8/9.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define EPS 1e-6
#define PI acos(-1)
struct Point{
double x,y;
Point(double x,double y): x(x),y(y) {}
};
struct Vector{
double x,y;
Vector(double x,double y): x(x),y(y) {}
};
Vector operator - (Point p,Point q)
{
return Vector(p.x-q.x,p.y-q.y);
}
int sign(double x)
{
return fabs(x)<EPS?0:x>0?1:-1;
}
double cross(Vector p,Vector q)
{
return p.x*q.y-p.y*q.x;
}
bool cmp(Point p,Point q)
{
if(p.x<q.x) return true;
else if(p.x-q.x) return false;
else return p.y<q.y;
}
void Graham(vector<Point> &points,vector<Point> &stack)
{
stack.clear();
sort(points.begin(),points.end(),cmp);
stack.push_back(points[0]);
stack.push_back(points[1]);
for(int i=2;i<points.size();i++)
{
while(stack.size()>1)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
int size=(int)stack.size();
stack.push_back(points[(int)points.size()-2]);
for(int i=(int)points.size()-3;i>=0;i--)
{
while(stack.size()>size)
{
Point k1=*(stack.end()-1);
Point k2=*(stack.end()-2);
if(sign(cross(k1-k2,points[i]-k2))<0) stack.pop_back();
else break;
}
stack.push_back(points[i]);
}
}
void check(vector<Point> stack)
{
int len;
len=(int)stack.size();
int i=0,j;
while(i<len-1)
{
for(j=i+1;j<len;j++)
{
Point k1=stack[i];
Point k2=stack[j];
if(j+1>=len) break;
Point k3=stack[j+1];
if(sign(cross(k2-k1,k3-k1))!=0) break;
}
if(j-i<=1||j-i+1==len) {printf("NO\n");return ;}
i=j;
}
printf("YES\n");
}
int main()
{
int t,n;
double x,y;
vector<Point> points;
vector<Point> stack;
scanf("%d",&t);
while(t--)
{
points.clear();
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&x,&y);
points.push_back(Point(x,y));
}
Graham(points,stack);
check(stack);
}
return 0;
}
相关文章推荐
- POJ 1228 Grandpa's Estate (凸包)
- POJ 1228 Grandpa's Estate
- POJ 1228 Grandpa's Estate (凸包唯一性判定 推荐)
- POJ 1228 Grandpa's Estate (求稳定凸包)
- Poj 1228 Grandpa's Estate (凸包及唯一性判定)
- POJ 1228 || Grandpa's Estate(凸包andrew算法
- POJ1228-Grandpa's Estate
- poj-1228 Grandpa's Estate(判断凸包是否唯一)
- zoj 1377 || poj 1228 Grandpa's Estate
- POJ1228-Grandpa's Estate(凸包)
- POJ 1228 Grandpa's Estate
- poj 1228 Grandpa's Estate 凸包模板题
- poj 1228 Grandpa's Estate(凸包)
- POJ 1228 Grandpa's Estate (凸包、保留凸包边上的点)
- poj 1228 Grandpa's Estate(凸包+判凸包边上的点数)
- Grandpa's Estate - POJ 1228(稳定凸包)
- POJ1228——Grandpa's Estate(计算几何,凸包)
- POJ 1228 Grandpa's Estate(稳定凸包)
- 【凸包性质】 POJ 1228 Grandpa's Estate
- POJ 1228 Grandpa's Estate【稳定凸包判断】