zoukankan      html  css  js  c++  java
  • hdu 2036 求多边形面积 (凸、凹多边形)

    <题目链接>

    Problem Description
    “ 改革春风吹满地,
    不会AC没关系;
    实在不行回老家,
    还有一亩三分地。
    谢谢!(乐队奏乐)”

    话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗。
    好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块。
    这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了。不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多少面积,如果回答正确才能真正得到这块地。
    发愁了吧?就是要让你知道,种地也是需要AC知识的!以后还是好好练吧...
     
    Input
    输入数据包含多个测试实例,每个测试实例占一行,每行的开始是一个整数n(3<=n<=100),它表示多边形的边数(当然也是顶点数),然后是按照逆时针顺序给出的n个顶点的坐标(x1, y1, x2, y2... xn, yn),为了简化问题,这里的所有坐标都用整数表示。
    输入数据中所有的整数都在32位整数范围内,n=0表示数据的结束,不做处理。
     
    Output
    对于每个测试实例,请输出对应的多边形面积,结果精确到小数点后一位小数。
    每个实例的输出占一行。
     
    Sample Input
    3 0 0 1 0 0 1
    4 1 0 0 1 -1 0 0 -1
    0
     
     
    Sample Output
    0.5
    2.0
     
    解题分析:
    求多边形面积不难,把该多边形分成多个三角形,然后根据三角形的叉乘,求出每一个三角形的面积,然后相加,即得到该多边形的面积。但是,非常重要的一点是,用叉乘的方法求出三角形的面积是有向面积,并且枚举三角形顶点时,必须是逆时针取,所以,对于凹边形,不要天真的以为每一个三角形的面积求出来都要是正数,画蛇添足的对每一个求出来的三角形取绝对值,我就在这里WA了好几次。
     
    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #include <stdlib.h>
    using namespace std;
    
    
    struct node
    {
        int x, y;
        node() {}
        node(int a, int b) :x(a), y(b) {}
    };
    
    node arr[110];
    
    double XMul(node a, node b)
    {
        //return fabs(a.x*b.y*1.0 - a.y*b.x*1.0)*0.5;         不能这样写,因为这个多边形可能是凹多边形
        return (a.x*b.y*1.0 - a.y*b.x*1.0)*0.5;
    }
    
    double area(node a, node b)        
    {             //p1,p2分别为该三角形的两个向量边
        node p1 = node(arr[1].x - a.x, arr[1].y - a.y);
        node p2 = node(arr[1].x - b.x, arr[1].y - b.y);
        return XMul(p1, p2);
    
    }
    
    int main()
    {
        int n;
        while (scanf("%d", &n) != EOF, n)
        {
            memset(arr, 0, sizeof(arr));
            double sum = 0;
            for (int i = 1; i <= n; i++)
            {
                scanf("%d %d", &arr[i].x, &arr[i].y);
            }
            node last = arr[2];
            for (int i = 3; i <= n; i++)
            {
                sum += area(last, arr[i]);
                last = arr[i];
            }
            printf("%.1lf
    ", fabs(sum));      //对sum取绝对值才是正解
        }
        return 0;
    }
     
     
     
    2018-08-01
  • 相关阅读:
    PAIRING WORKFLOW MANAGER 1.0 WITH SHAREPOINT 2013
    Education resources from Microsoft
    upgrade to sql server 2012
    ULSViewer sharepoint 2013 log viewer
    Top 10 Most Valuable Microsoft SharePoint 2010 Books
    讨论 Setsockopt选项
    使用 Alchemy 技术编译 C 语言程序为 Flex 可调用的 SWC
    Nagle's algorithm
    Nagle算法 TCP_NODELAY和TCP_CORK
    Design issues Sending small data segments over TCP with Winsock
  • 原文地址:https://www.cnblogs.com/00isok/p/9403493.html
Copyright © 2011-2022 走看看