歪日,用了两个凸包板子,就是正确不了,自己思路也没啥问题啊。落泪了,以为是板子的问题,可能是我的问题.

我靠,就在我写一篇“没做出题的失败的博客的时候”,抱着试一试的心态,歪日,AC了。什么玄学过题.

在做这题的时候,一个小技巧:在判断三点共线时,可以用利用叉积为0来判断三点共线。

/*B Convex Polygon 二维几何:判断所给的点是否为凸多边形.并按顺时针顺序输出点(从最接近(0,0)的点开始输出)若为否(三点共线或不为凸多边形)输出"ERROR".
*//*
题目实际上没有所谓的 “非法 ”输入。
题目要判断是输入的所有点能否构成一个凸多边形,并且任意 3点不共线。
先判断点数 ≥3,然后O(n^3)暴力判断三点共线,最后求凸包判断凸包上的点是否等于总点数即可.
*/#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>using namespace std;const int maxn = 110;
const double eps = 1e-7;struct Point {int x, y;Point(int x = 0,int y = 0):x(x),y(y){}
};
typedef Point Vector;
Point lst[maxn];
int stk[maxn], top;
Vector operator - (Point A, Point B){return Vector(A.x-B.x, A.y-B.y);
}
int sgn(int x){if(x == 0)return 0;if(x < 0)return -1;return 1;
}
int Cross(Vector v0, Vector v1) {return v0.x*v1.y - v1.x*v0.y;
}
int Dis(Point p1, Point p2) { //计算 p1p2的 距离的平方 return (p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y);
}
bool cmp(Point p1, Point p2){ //极角排序函数 ,角度相同则距离小的在前面int tmp = sgn(Cross(p1 - lst[0], p2 - lst[0]));if(tmp > 0)return true;if(tmp == 0 && Dis(lst[0], p1) < Dis(lst[0], p2))return true;return false;
}void Graham(int n) {       // n为点的个数.       下标为 0 - n-1 int k = 0;Point p0;p0.x = lst[0].x;p0.y = lst[0].y;for(int i = 1; i < n; ++i) {if( (p0.y > lst[i].y) || ((p0.y == lst[i].y) && (p0.x > lst[i].x)) ) {p0.x = lst[i].x;p0.y = lst[i].y;k = i;}}lst[k] = lst[0];lst[0] = p0;sort(lst + 1, lst + n, cmp);stk[0] = 0;stk[1] = 1;top = 2;for(int i = 2; i < n; ++i) {while(top > 1 && Cross(lst[stk[top - 1]] - lst[stk[top - 2]], lst[i] - lst[stk[top - 2]]) <= 0)--top;stk[top] = i;++top;}return;
}
//typedef Point Vector;
//Vector operator - (Point A, Point B){//    return Vector(A.x-B.x, A.y-B.y);
//}
//bool operator < (const Point& a, const Point& b){//    if(a.x == b.x)
//        return a.y < b.y;
//    return a.x < b.x;
//}
//int Cross(Vector v0, Vector v1) {//    return v0.x*v1.y - v1.x*v0.y;
//}//计算凸包,输入点数组为 p,个数为 n, 输出点数组为 ch。函数返回凸包顶点数
//如果不希望凸包的边上有输入点,则把两个 <= 改为 <
//在精度要求高时建议用dcmp比较
//输入不能有重复点,函数执行完后输入点的顺序被破坏
//Point lst[maxn];
//Point stk[maxn], top;
//int ConvexHull(int n) {//    sort(lst, lst+n);
//    int m = 0;
//    for(int i = 0; i < n; ++i) {//        while(m > 1 && Cross(stk[m-1] - stk[m-2], lst[i] - stk[m-2]) < 0) {//            m--;
//        }
//        stk[m++] = lst[i];
//    }
//    int k = m;
//    for(int i = n-2; i>= 0; --i) {//        while(m > k && Cross(stk[m-1] - stk[m-2], lst[i] - stk[m-2]) < 0) {//            m--;
//        }
//        stk[m++] = lst[i];
//    }
//    if(n > 1)
//        --m;
//    return m;
//}signed main()
{int x,y;int k = 0;while(~scanf("%d,%d,",&x,&y)){lst[k++] = {x,y};}bool f = 1;if(k<3)    f = 0;else{for(int i=0;i<k;i++){if(!f)    break;for(int j=i+1;j<k;j++){if(!f)  break;for(int p=j+1;p<k;p++){if(Cross(lst[i]-lst[j],lst[i]-lst[p])==0){f = 0;break;}}     }       }       if(f){Graham(k);if(k!=top) f = 0;}}   if(f){int id = -1;int mi = 10000000.00;        //距离的平方. Point w;w.x = 0,w.y = 0;for(int i=0;i<k;i++){if(Dis(lst[i],w)<mi){id = i;mi = Dis(lst[i],w);}}printf("%d,%d,",lst[id].x,lst[id].y);int o = 1;// 按照一个方向输出 (逆时针)for(int i=k-1;i>id;i--){o++;if(o!=k) printf("%d,%d,",lst[i].x,lst[i].y);else   printf("%d,%d",lst[i].x,lst[i].y);}       for(int i=id-1;i>=0;i--){o++;if(o!=k)   printf("%d,%d,",lst[i].x,lst[i].y);else   printf("%d,%d",lst[i].x,lst[i].y);}}else{printf("ERROR");}  return 0;
}
// 0,0,2,0,1,1,1,2
//(P[i].x==P[j].x && P[j].x==P[p].x) || (fabs(((double)P[p].y-P[j].y)/((double)P[p].x-P[j].x))-fabs(((double)P[i].y-P[j].y)/((double)P[i].x-P[j].x))<=1e-2)

凸包板子试炼(玄学过题)相关推荐

  1. HDU - 3694 Fermat Point in Quadrangle(三分套三分/凸包)

    题目链接:点击查看 题目大意:给出四个点,求出该四边形的费马点,费马点是求得一个点,到这四个点的距离最小,最后输出距离, 题目分析:三分套三分,外层三分x,内层三分y即可,不过就是目前来说遇到的所有三 ...

  2. CF70D Professor's task(动态凸包)

    题面 两种操作: 1 往点集S中添加一个点(x,y); 2 询问(x,y)是否在点集S的凸包中. 数据保证至少有一个2操作, 保证刚开始会给出三个1操作, 且这三个操作中的点不共线. 题解 动态凸包板 ...

  3. 凸包问题--动态凸包(平衡树维护)

    前景提要: 继承上一张学习的凸包问题,下面我么来总结一下动态凸包的维护问题. 一些点已经构成了一个凸包之后,新加入||删除一些新的点的时候,会对原有的凸包产生一些影响,如果每次都重新把所有点都重新计算 ...

  4. 算法复习——凸包加旋转卡壳(poj2187)

    题目: Description Bessie, Farmer John's prize cow, has just won first place in a bovine beauty contest ...

  5. Jozky 刷题目录

    文章目录 本目录参考OI-Wiki 还未解决专区 算法基础 枚举 模拟 递归&分治 贪心 排序 前缀和&差分 二分 倍增 构造 搜索 DFS && BFS 双向搜索 启 ...

  6. 点积和叉积和凸包背诵用模板

    点积:     x1*x2+y1*y2 用处:求向量夹角,     cos(a,b)=(a·b)/(|a|*|b|) 叉积:    x1*y2-x2*y1 用处:判断矢量位置关系,     sin(a ...

  7. 2018 Multi-University Training Contest 3: G. Interstellar Travel(凸包)

    题意:给你平面上n个点,第一个点一定在(0, 0),第n个点的y坐标一定为0,除此之外中间所有点的x坐标一定大于0且小于最后一个点的x坐标,你从一号点开始出发,中间从第i个点到第j个点必须满足xj&g ...

  8. 侍魂微信新服务器,侍魂手游2019年3月23日微信问答试炼答案

    "风筝大赛"活动中,活动结束排行榜前一百名可以获得什么称号?(回答格式为:SH+答案,如答案是莉姆酱,则回复SH莉姆酱)这是侍魂手游2019年3月23日微信问答试炼每日一题题目.答 ...

  9. 侍魂微信第一个服务器,侍魂手游2019年4月12日微信问答试炼答案

    原标题:侍魂手游2019年4月12日微信问答试炼答案 爱心榜前30名可以获得什么限时称号?(回答格式为:SH+答案,如答案是莉姆酱,则回复SH莉姆酱)这是侍魂手游2019年4月12日微信问答试炼每日一 ...

最新文章

  1. php用命令查mysql_phpMySQL命令大全总结
  2. SQL语句中拆分字段
  3. pytorch CenterLoss
  4. 笔记本电脑linux系统下载,给笔记本电脑装Linux系统
  5. Synergy工具 共享Windows系统电脑Linux系统电脑 鼠标键盘
  6. 深度学习-数学-第一篇-标量,向量,矩阵,张量
  7. dispatch作用 react_javascript – redux-react中的dispatch函数
  8. 学习web前端历程(十七)
  9. 外贸企业财务软件的选用
  10. 基于特征点检测的人脸融合技术
  11. 综合应用_6多字符串-烟锁池塘柳
  12. 网络编程 多道技术与同步/异步和阻塞/非阻塞
  13. npm install安装失败,报错记录之The operation was rejected by your operating system. node-sass无法安装,且禁用淘宝镜像
  14. 自己的一些车机app 界面
  15. iOS 控制任务执行顺序
  16. 2.东软跨境电商数仓项目技术选型
  17. UT单元测试(一)——基础流程总结篇
  18. [待续]联想ThinkPadE420升级之路:英睿达(Crucial)MX500+XP开启AHCI模式+64位win10
  19. Linux下BMP图片添加水印
  20. VR场景制作报价是多少

热门文章

  1. Linux 基本命令(八)--touch 常用命令
  2. 《Applying Deep Learning to Answer Selection: A Study And an Open Task》文章理解小结
  3. Swift 编程语言
  4. 设计模式之Flyweight模式(笔记)
  5. 设计模式-------建造者模式(生成器模式)
  6. 解决 IntelliJ 乱码问题
  7. 解决MyEclipse里Tomcat端口被占用而无法启动的情况
  8. datetime使用
  9. 查看SAP CRM和C4C的UI technical信息 1
  10. leveldb - log格式