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

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

思路 :先用GCD函数求出边界上的点,用Pick公式求出边界多边形内部的格点数

Pick公式:给定顶点坐标均是整点的简单多边形,有:

面积=内部格点数目+边上格点数目/2-1;

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std ;
struct node
{
double x ;
double y ;
node() {}
node(double a,double b):x(a),y(b){}
}ch[] ;
int m ;
double det(const node &a,const node &b)//计算两个向量的叉积
{
return a.x*b.y-a.y*b.x;
}
double area()//求多边形的面积
{
double sum = 0.0 ;
ch[m]=ch[];
for(int i = ; i < m ; i++)
sum += det(ch[i],ch[i+]) ;
return sum/2.0 ;
}
int gcd(int a,int b)
{
int temp ;
if(a > b)
{
temp = a ;
a = b ;
b = temp ;
}
while(b != )
{
temp = a%b ;
a = b ;
b = temp ;
}
return a ;
}
int main()
{
int n ;
cin>>n ;
for(int i = ; i < n ; i++)
{
int count = ;
cin>>m ;
int xx = , yy = ,a,b;
ch[].x = ;
ch[].y = ;
for(int j = ; j < m ; j++)
{
cin>>a>>b ;
count +=gcd(abs(a),abs(b)) ;//求边界格点数目
ch[j+].x = a + xx ;
ch[j+].y = b + yy ;
xx = ch[j+].x ;
yy = ch[j+].y ;
}
double sum = area() ;
cout<<"Scenario #"<<i+<<":"<<endl;
printf("%d %d %.1lf\n\n",int(sum)+-(count/),count,sum);
}
}

注 :GCD函数还有更简单的书写方式

int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}

POJ1265Area的更多相关文章

  1. poj1265Area(pick定理)

    链接  Pick定理是说,在一个平面直角坐标系内,如果一个多边形的顶点全都在格点上,那么这个图形的面积恰好就等于边界上经过的格点数的一半加上内部所含格点数再减一. pick定理的一些应用 题意不好懂, ...

随机推荐

  1. php 中cookie和session的用法比较

    1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session. ...

  2. [转]WCF 4 安全性和 WIF 简介

      转自:http://www.cnblogs.com/WizardWu/archive/2010/10/04/1841793.html 本帖简介 .NET 新一代的 Windows Identity ...

  3. 大数据技术 —— MapReduce 简介

    本文为senlie原创,转载请保留此地址:http://www.cnblogs.com/senlie/ 1.概要很多计算在概念上很直观,但由于输入数据很大,为了能在合理的时间内完成,这些计算必须分布在 ...

  4. 过程式编程 drawShapes

    // // main.m // 3.2.1 过程式编程 #import <Foundation/Foundation.h> typedef enum { kCircle, kRectang ...

  5. 值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识

    学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html 一 值类型与引用类型 需要注意的string 是特殊类型的引用类型. 使用方法: ...

  6. 20141015--for语句2

    for语句,打印等腰三角形: 第一种方法:(使用for语句嵌套) 第二种方法:(定义string型变量) 以下是其他形状的等腰三角形: (穿插使用了for语句嵌套,定义string型)

  7. Js 变量的作用域

    变量的作用域 所有的变量作用域是指在哪里可用哪里不可用 局部作用域和全局作用域 在js中以函数来分割作用域 在函数里面就叫做局部作用域,在函数外面的就叫全局作用域 在函数里面如果省略var 关键字 那 ...

  8. C/C++ union

    叙述原因: union data{ int a;double b;}; 对于union,实际中用的并不多,之前也知道怎样计算union的单元(在字对齐的基础上取最大成员所占的内存大小),比如 unio ...

  9. CMakeLists实战解读--YouCompleteMe

    原文转载自:Ricky.K http://www.cnblogs.com/rickyk/p/3877238.html 个人一直有一个想法,就是想出一系列关于CMakeLists.txt国外经典例子的实 ...

  10. ES6学习笔记(九)

    1.概述 ES5的对象属性名都是字符串,这容易造成属性名的冲突.比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin模式),新方法的名字就有可能与现有方法产生冲突.如果有一种机制 ...