HDU 2108 逆时针给出多边形的顶点,判断是否为凸多边形,水题
下面是别人解题报告的链接,很详细,写的很好
http://blog.csdn.net/chl_3205/article/details/8520597
下面贴我的代码
#include <cstdio>
struct point
{
int x,y;
} p[];
bool checkDir(point p0,point p1,point p2)
{
if((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y) * (p2.x-p0.x) > )
return true;
else return false;
}
int main()
{
// freopen("in.cpp","r",stdin);
int n;
while(scanf("%d",&n),n)
{
for(int i=; i<n; ++i)
scanf("%d%d",&p[i].x,&p[i].y);
bool flag = true;
bool cur = checkDir(p[],p[],p[]);
for(int i=; i<n; ++i)
{
bool f = checkDir(p[i],p[(i+)%n],p[(i+)%n]);
if(f != cur)
{
flag = false;
break;
}
}
if(flag ) printf("convex\n");
else printf("concave\n");
}
return ;
}
虽然这是一个水题,但是其中的思想与Andrew算法求凸包的思想是一样的。。。。
Andrew算法求凸包的思想大概是:先将所有点按坐标x从小到大排序,x相同按y从小到大排序。
然后按排好顺序的序列顺序前进,是往左走的就加入凸包,出现往右走的就回溯剔除点,直到往左走。这样求出下半个凸包。
再逆序前进一遍,同理,求出上半个凸包。刘汝佳的白书中有介绍。
下面的代码本质上是在求凸包,但是也可以用来判断该多边形是否为凸多边形。同时不要求点是按逆时针顺序给出的。
//求凸包Andrew扫描算法,复杂度主要为排序O(n*logn),扫描为O(n)
#include <cstdio>
#include <algorithm>
#define INF 0x7fffffff
using namespace std;
struct point
{
int x,y;
bool operator <(const point & other) const
{
if(x < other.x)
return true;
if(x == other.x && y < other.y)
return true;
return false;
};
} p[],convex[];
bool checkDir(point p0,point p1,point p2)
{
if((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y) * (p2.x-p0.x) <= )
return true;
else return false;
}
int main()
{
// freopen("in.cpp","r",stdin);
int n;
while(scanf("%d",&n) ,n)
{
for(int i=; i<n; ++i)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n);
int m=;
for(int i=; i<n; ++i)
{
while(m > && checkDir(convex[m-],convex[m-],p[i]) ) --m;
convex[m++] = p[i];
}
int k =m;
for(int i=n-; i>=; --i)
{
while(m > k && checkDir(convex[m-],convex[m-],p[i]) ) --m;
convex[m++] = p[i];
}
if(n >) --m;
if(m == n) printf("convex\n");
else printf("concave\n");
}
return ;
}
求凸包有很多算法吧,应该,下面是详细介绍一种貌似叫Graham算法求凸包,但是该算法数值稳定性没有Andrew算法好,它还要求角的余弦值,排序。
http://wenku.baidu.com/view/5bfee1dbd15abe23482f4d84.html
HDU 2108 逆时针给出多边形的顶点,判断是否为凸多边形,水题的更多相关文章
- HDU 1086 You can Solve a Geometry Problem too( 判断线段是否相交 水题 )
链接:传送门 题意:给出 n 个线段找到交点个数 思路:数据量小,直接暴力判断所有线段是否相交 /*************************************************** ...
- HDU 1040 As Easy As A+B (排序。。。水题)
题意:给定n个数,让你从小到大排序. 析:不说什么了. 代码如下: #include <cstdio> #include <iostream> #include <cst ...
- hdu 2108 Shape of HDU【判断多边形是否是凸多边形模板】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2108 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- *HDU 2108 计算几何
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hdu 2108 Shape of HDU 判断是否为凸多边形
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...
- hdu 2108 Shape of HDU (数学)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)
Shape of HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)
再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 253(37 users) Total Accepted: 56(2 ...
随机推荐
- MySQL函数GROUP_CONCAT() 实现多条数据合并
group_concat()会计算哪些行属于同一组,将属于同一组的列显示出来,group by指定的列进行分组. 例如: -- 根据物流订单id查询所有物流订单,车源订单,车辆信息(多条数据合并为一条 ...
- Codeforces 735B - Urbanization
735B - Urbanization 思路:贪心.人数少的城市住钱最多的那几个人. 不证明了,举个例子吧:a1<a2<a3<a4<a5 (a1+a2+a3)/3+(a4+a5 ...
- UVA - 11853 Paintball(dfs)
UVA - 11853 思路:dfs,从最上面超过上边界的圆开始搜索,看能不能搜到最下面超过下边界的圆. 代码: #include<bits/stdc++.h> using namespa ...
- JSP生成验证码
<%@ page language="java" import="java.util.*" pageEncoding="gbk"%&g ...
- Java基础九--抽象类
Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...
- Servlet / Tomcat / Spring 之间的关系
0.基础知识 在idea中打开servlet的源码: 可以看见servlet就是一个接口:接口就是规定了一些规范,使得一些具有某些共性的类都能实现这个接口,从而都遵循某些规范. 有的人往往以为就是se ...
- SVN同步版本库与网站目录
如何创建SVN版本库及同步文件到WEB目录 来源:空谷 一 安装与配置SVN 1.安装subversion centos: yum install subversion ubuntu: apt-get ...
- javascript之非构造函数的继承
这个系列的第一部分介绍了"封装",第二部分介绍了使用构造函数实现"继承". 今天是最后一个部分,介绍不使用构造函数实现"继承". 一.什么是 ...
- python-day28--logging模块
1.默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > E ...
- python爬虫-链家租房信息获取
#导入需要用到的模块 import requests import pymysql import time from bs4 import BeautifulSoup import tkinter a ...