首页 > 代码库 > 【HDOJ】1348 Wall
【HDOJ】1348 Wall
计算几何-凸包模板题目,Graham算法解。
1 /* 1348 */ 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <cstdlib> 6 #include <cmath> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXN 100511 12 typedef struct Point_t {13 double x, y;14 Point_t() {}15 Point_t(double xx, double yy) {16 x = xx; y = yy;17 }18 } Point_t;19 20 Point_t stack[MAXN];21 Point_t points[MAXN];22 const double PI = acos(-1.0);23 int n;24 25 double Length(Point_t a, Point_t b) {26 return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));27 }28 29 double cross(Point_t p0, Point_t p1, Point_t p2) {30 return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);31 }32 33 bool comp(Point_t a, Point_t b) {34 double k = cross(points[0], a, b);35 return !(k<0 || (k==0 && Length(points[0], a)>Length(points[0], b)));36 }37 38 double Graham() {39 double ret = 0;40 int i, j, k;41 int top;42 Point_t p0;43 44 p0 = points[0];45 k = 0;46 for (i=1; i<n; ++i) {47 if (points[i].x<p0.x || (points[i].x==p0.x && points[i].y<p0.y)) {48 p0 = points[i];49 k = i;50 }51 }52 53 points[k] = points[0];54 points[0] = p0;55 sort(points+1, points+n, comp);56 57 stack[0] = points[0];58 stack[1] = points[1];59 stack[2] = points[2];60 top = 2;61 for (i=3; i<n; ++i) {62 while (cross(stack[top-1], stack[top], points[i])<=0 && top>1)63 --top;64 stack[++top] = points[i];65 }66 stack[++top] = p0;67 for (i=1; i<=top; ++i)68 ret += Length(stack[i-1], stack[i]);69 70 return ret;71 }72 73 int main() {74 int t;75 int i, j, k, tmp;76 double l, ans;77 78 #ifndef ONLINE_JUDGE79 freopen("data.in", "r", stdin);80 #endif81 82 scanf("%d", &t);83 while (t--) {84 scanf("%d %lf", &n, &l);85 for (i=0; i<n; ++i)86 scanf("%lf %lf", &points[i].x, &points[i].y);87 ans = Graham();88 ans += PI * (l+l);89 printf("%.0lf\n", ans);90 if (t)91 printf("\n");92 }93 94 return 0;95 }
【HDOJ】1348 Wall
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。