题目描述
你将计算一种特殊多边形的面积。多边形的一个顶点是正交坐标系的原点。从这一点,你可以一步一步走到下面的顶点的多边形直到回到初始顶点。每一步你可以向北、西、南或东走,单位长度为1单位,或西北、东北、西南或东南,步长为2平方根。
例如,这是一个要计算的合法多边形,它的面积是2.5:
输入
输入的第一行是整数t(1 < = < = 20),测试多边形的数目。下面的每一行包含一个由1-9个数字组成的字符串,描述从原点走起多边形是如何形成的。这里8, 2, 6和4代表北、南、东和西,而9, 7, 3和1分别代表东北、西北、东南和西南。数字5只出现在序列的最后,表示停止行走。你可以假设输入多边形是有效的,这意味着端点总是起始点,而多边形的边不互相交叉,每一行最多可以包含1000000个数字。
输出
对于每个多边形,在一行上打印它的面积。
分析
这题可谓是POJ一道奇葩题啊
这题不需要将点排序成逆时针来求正确的面积
(上面的才是正解啊)
而是无论面积正负,最后求个绝对值???
说真的,这样的面积真的不对
因为如果位置刚好相反的两个面积本因是有值的,但是这样处理却没有值。。。
不过A了就好
我在程序中还加了如何将点排序成逆时针的compare函数,用于sort(虽然没用)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
int t,i,k;
long long x,y,ass;
struct B
{
int x,y;
}b[1000001];
char c;
long long cp(int x1,int y1,int x2,int y2)
{
long long couple=x2*y1-y2*x1;
return couple;
}
bool cmp(B a,B b)
{
return cp(a.x,a.y,b.x,b.y)<0||cp(a.x,a.y,b.x,b.y)==0;
}
int main()
{
scanf("%d\n",&t);
while (--t>=0)
{
ass=0;
x=0;y=0;k=0;
while (1)
{
c=getchar();
if (c=='\n') c=getchar();
if (c=='5') break;
switch (c)
{
case '8':
{
y++;break;
}
case '4':
{
x--;break;
}
case '2':
{
y--;break;
}
case '6':
{
x++;break;
}
case '1':
{
y--;x--;break;
}
case '7':
{
y++;x--;break;
}
case '9':
{
y++;x++;break;
}
case '3':
{
y--;x++;break;
}
}
k++;
b[k].x=x;
b[k].y=y;
}
for (i=1;i<=k;i++)
ass+=cp(b[i].x,b[i].y,b[i-1].x,b[i-1].y);
if (ass<0) ass=-ass;
if (ass%2==0) printf("%lld\n",ass/2);
else printf("%lld.5\n",ass/2);
}
}
本文介绍了一种特殊的多边形面积计算方法,通过输入序列确定多边形形状,并使用特定算法计算其面积,适用于正交坐标系下由特定步长构成的多边形。
614

被折叠的 条评论
为什么被折叠?



