题目:http://poj.org/problem?id=1265

题意 : 给你一个点阵,上边有很多点连成的多边形,让你求多边形内部的点和边界上的点以及多边形的面积,要注意他每次给出的点并不是点的横纵坐标,而是相对于上一个点的横纵坐标离开的距离dx,dy,所以你还要求一下每个点的坐标,然后再进行别的操作就可以了

题目解析:

这个题用了很多知识点:

1、以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数。如果dx或dy为0,则覆盖的点数为dy或dx。
2、Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1。
3、任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和/2。

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
struct point
{
int x,y;
} q[];
int n;
ll num,In;
double S;
int gcd(int A,int B)
{
return B==?A:gcd(B,A%B);
}
int Mult(point A,point B)
{
return A.x*B.y-B.x*A.y;
}
int main()
{
int T,xx,yy,sx,sy,dx,dy,K=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
sx=sy=;
S=;
num=;
for(int i=; i<=n; i++)
{
scanf("%d%d",&xx,&yy);
sx+=xx;
sy+=yy;
q[i].x=sx;
q[i].y=sy;
}
q[].x=q[n].x;
q[].y=q[n].y;
for(int i=; i<n; i++)
{
S+=Mult(q[i],q[i+]);
dx=abs(q[i].x-q[i+].x);
dy=abs(q[i].y-q[i+].y);
num+=gcd(max(dx,dy),min(dx,dy));
}
S=fabs(S/);//不确定S是否为正数
In=int(S)+-num/;
printf("Scenario #%d:\n",++K);
printf("%I64d %I64d %.1f\n\n",In,num,S);
}
return ;
}

代码:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#define inf 0x3f3f3f3f
#define eps 1e-9
typedef long long ll;
using namespace std;
struct point
{
int x,y;
} q[];
int n;
ll num,In;
double S;
int gcd(int A,int B)
{
return B==?A:gcd(B,A%B);
}
int Mult(point A,point B)
{
return A.x*B.y-B.x*A.y;
}
int main()
{
int T,xx,yy,dx,dy,K=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
q[].x=;
q[].y=;
S=;
num=;
for(int i=; i<=n; i++)
{
scanf("%d%d",&xx,&yy);
q[i].x=q[i-].x+xx;
q[i].y=q[i-].y+yy;
}
for(int i=; i<n; i++)
{
S+=Mult(q[i],q[i+]);
dx=abs(q[i].x-q[i+].x);
dy=abs(q[i].y-q[i+].y);
num+=gcd(max(dx,dy),min(dx,dy));
}
S=fabs(S/);//不确定S是否为正数
In=int(S)+-num/;
printf("Scenario #%d:\n",++K);
printf("%I64d %I64d %.1f\n\n",In,num,S);
}
return ;
}

POJ1265:Area(多边形面积公式+pick公式) 好题的更多相关文章

  1. POJ1265 Area 多边形内格点数 Pick公式

    POJ1265给定一个多边形 计算边上的格点 内部的格点 以及多边形的面积 利用Pick公式  面积=内部格点数+边上格点数/2-1 将多边形分割为三角形容易证得上述公式 计算面积用叉积,计算边上格点 ...

  2. poj 1654 Area 多边形面积

    /* poj 1654 Area 多边形面积 题目意思很简单,但是1000000的point开不了 */ #include<stdio.h> #include<math.h> ...

  3. POJ 1654 Area 多边形面积 G++会WA

    #include<stdio.h> #include<algorithm> #include <cstring> using namespace std; type ...

  4. POJ 1265 Area POJ 2954 Triangle Pick定理

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5227   Accepted: 2342 Description ...

  5. POJ1265——Area(Pick定理+多边形面积)

    Area DescriptionBeing well known for its highly innovative products, Merck would definitely be a goo ...

  6. Area - POJ 1265(pick定理求格点数+求多边形面积)

    题目大意:以原点为起点然后每次增加一个x,y的值,求出来最后在多边形边上的点有多少个,内部的点有多少个,多边形的面积是多少. 分析: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其 ...

  7. poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】

    题目:http://poj.org/problem?id=1265 Sample Input 2 4 1 0 0 1 -1 0 0 -1 7 5 0 1 3 -2 2 -1 0 0 -3 -3 1 0 ...

  8. POJ 1265 Area (Pick定理 & 多边形面积)

    题目链接:POJ 1265 Problem Description Being well known for its highly innovative products, Merck would d ...

  9. poj 1654:Area 区域 ---- 叉积(求多边形面积)

    Area   Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19398   Accepted: 5311 利用叉积求多边形面 ...

随机推荐

  1. MySQL 5.6的72个新特性(译)

    一,安全提高 1.提供保存加密认证信息的方法,使用.mylogin.cnf文件.使用 mysql_config_editor可以创建此文件.这个文件可以进行连接数据库的访问授权. mysql_conf ...

  2. loadOnStartup = 1

    在servlet的配置当中,<load-on-startup>5</load-on-startup>的含义是:标记容器是否在启动的时候就加载这个servlet.当值为0或者大于 ...

  3. Spring Cloud对于中小型互联网公司来说是一种福音

    Spring Cloud对于中小型互联网公司来说是一种福音,因为这类公司往往没有实力或者没有足够的资金投入去开发自己的分布式系统基础设施,使用Spring Cloud一站式解决方案能在从容应对业务发展 ...

  4. 学习:erlang正则

    一.re:run/3. ①.re:run("321321","2132",[caseless]).     {match,[{1,4}]} %% 返回值是 匹配 ...

  5. LPCTSTR —— 摘自百度百科

    LPCTSTR用来表示字符是否使用UNICODE. 如果程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串. 类型理解:L,表示 ...

  6. request Dispatch

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletExcepti ...

  7. identity_insert---实验性插入大批量数据和分页存储过程

    OK,我们首先创建一数据库:data_Test,并在此数据库中创建一表:tb_TestTable 1create database data_Test --创建数据库data_Test 2use da ...

  8. Window发声函数Beep、MessageBeep

     C++ Code  1234567891011   WINBASEAPI BOOL WINAPI Beep(__in DWORD dwFreq,      __in DWORD dwDuration ...

  9. C#中Uri类的解释

    URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源.而URL是uniform resource locator,统一资源定位器,它是一种具体的UR ...

  10. PHP正则表达式 /i, /s, /x,/u, /U, /A, /D, /S等模式修饰符

    i (PCRE_CASELESS) 如果设置了这个修饰符, 模式中的字母会进行大小写不敏感匹配. m (PCRE_MULTILINE) 默认情况下, PCRE认为目标字符串是由单行字符组成的(然而实际 ...