zoukankan      html  css  js  c++  java
  • POJ 2007 Scrambled Polygon 凸包点排序逆时针输出

    题意:如题

    用Graham,直接就能得到逆时针的凸包,找到原点输出就行了,赤果果的水题~

    代码:

    /*
    *  Author:      illuz <iilluzen[at]gmail.com>
    *  Blog:        http://blog.csdn.net/hcbbt
    *  File:        poj2007.cpp
    *  Create Date: 2013-11-14 18:55:37
    *  Descripton:  convex hull 
    */
    
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    #define sqr(a) ((a) * (a))
    #define dis(a, b) sqrt(sqr(a.x - b.x) + sqr(a.y - b.y))
    
    const int MAXN = 110;
    const double PI = acos(-1.0);
    
    struct Point {
    	int x;
    	int y;
    	Point(double a = 0, double b = 0) : x(a), y(b) {}
    	friend bool operator < (const Point &l, const Point &r) {
    		return l.y < r.y || (l.y == r.y && l.x < r.x);
    	}
    } p[MAXN], ch[MAXN];
    // p, point   ch, convex hull
    
    double mult(Point a, Point b, Point o) {
    	return (a.x - o.x) * (b.y - o.y) >= (b.x - o.x) * (a.y - o.y);
    }
    
    int Graham(Point p[], int n, Point res[]) {
    	int top = 1;
    	sort(p, p + n);
    	if (n == 0) return 0;
    	res[0] = p[0];
    	if (n == 1) return 0;
    	res[1] = p[1];
    	if (n == 2) return 0;
    	res[2] = p[2];
    	for (int i = 2; i < n; i++) {
    		while (top && (mult(p[i], res[top], res[top - 1])))
    			top--;
    		res[++top] = p[i];
    	}
    	int len = top;
    	res[++top] = p[n - 2];
    	for (int i = n - 3; i >= 0; i--) {
    		while (top != len && (mult(p[i], res[top], res[top - 1])))
    			top--;
    		res[++top] = p[i];
    	}
    	return top;
    }
    
    int n;
    
    int main() {
    	while (scanf("%d%d", &p[n].x, &p[n].y) != EOF)
    		n++;
    	n = Graham(p, n, ch);
    	int t;
    	for (int i = 0; i < n; i++)
    		if (ch[i].x == 0 && ch[i].y == 0) {
    			t = i;
    			break;
    		}
    
    	for (int i = t; i < n; i++)
    		printf("(%d,%d)
    ", ch[i].x, ch[i].y);
    	for (int i = 0; i < t; i++)
    		printf("(%d,%d)
    ", ch[i].x, ch[i].y);
    	return 0;
    }
    


  • 相关阅读:
    P3916 图的遍历 dfs
    P4568 [JLOI2011]飞行路线 分层图最短路
    P1948 [USACO08JAN]电话线Telephone Lines spfa 二分答案
    P1849 [USACO12MAR]拖拉机Tractor bfs
    P1730 最小密度路径 floyed
    P1661 扩散 二分答案 并查集
    使用unittest和Django搭配写一个接口测试平台
    AJAX解决跨域的几种方式
    Django
    基于pytest框架自动化测试脚本的编写
  • 原文地址:https://www.cnblogs.com/riskyer/p/3424009.html
Copyright © 2011-2022 走看看