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\n", fabs(sum));      //对sum取绝对值才是正解
    }
    return 0;
}

2018-08-01

原文地址:https://www.cnblogs.com/00isok/p/9403493.html

时间: 2024-10-13 21:07:27

hdu 2036 求多边形面积 (凸、凹多边形)的相关文章

三角剖分求多边形面积的交 HDU3060

1 //三角剖分求多边形面积的交 HDU3060 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <stack> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 12 const int max

poj1408——叉积求多边形面积

poj1408——叉积求多边形面积 Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1853   Accepted: 1185 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previou

poj1265--Area(求多边形面积+匹克定理)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5150   Accepted: 2308 Description Being well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new resear

HDU 2036 改革春风吹满地 (求多边形面积)

传送门: 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 42663    Accepted Submission(s): 21856 Problem Description " 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如

poj 1654 Area(求多边形面积)

题意:从原点出发向八个方向走,所给数字串每个数字代表一个方向,终点与原点连线,求所得多边形面积: 思路:(性质)共起点的两向量叉积的一半为两向量围成三角形的面积.以此计算每条边首尾两个向量的叉积,求和,除二: #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const dou

Area - POJ 1654(求多边形面积)

题目大意:从原点开始,1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走.求出最后的多边形面积. 分析:这个多边形面积很明显是不规则的,可以使用向量积直接求出来面积即可. 代码如下: ------------------------------------------------------------------------------------------------------------------------------

HDOJ-2036-改革春风吹满地 叉积求多边形面积

改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22754 Accepted Submission(s): 11772 Problem Description " 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目

HDU 2036 求任意多边形面积向量叉乘

三角形的面积可以使用向量的叉积来求: 对于 三角形的面积 等于: [(x2 - x1)*(y3 - y1)- ( y2 - y1 ) * ( x3 - x1 )  ] / 2.0 但是面积是有方向的,对于一个多边形,我们任意选取一点(通常选取 0,0),和多边形的定点相连接, 对于顺序排列的顶点,我们求原点和一对相邻的顶点组成的三角形的叉积,将这些叉积的一半累加起来 由于叉积的方向,在多边形外面的部分会抵消,这样就是多边形的面积了. 最后对结果要取绝对值,因为算出来的叉积有可能是负数: 附上例题

杭电 2036 改革春风吹满地【求多边形面积】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2036 解题思路:将多边形划分成n个三角形,将这些三角形的面积依次累加求和即可,这里将多边形划分成若干个小三角形时有两种办法. 1 在多边形的内部任意选择一个点O,这样可以将n边行划分成n个小三角形,将这n个三角形的面积加起来就可以了.详情参见http://blog.csdn.net/sun_shine_/article/details/18799739 2 选择多边形上的一个点作为每个划分出来的小三