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. 第四十五篇、UITableViewCell高度计算

    由于tableView:heightForRowAtIndexPath:方法的调用频率非常高,如果将cell高度的计算过程放在此方法中,那么效率将会非常的低,快速tableview就会出现卡顿 1.通 ...

  2. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  3. jquery文字左右滚动

    实现jquery文字左右滚动 <div class="fl">中奖名单:</div> <div class="scrollText" ...

  4. HTML5之广播聊天室

    - 服务器端广播文本- 所有客户端都可以收到 --- 客户端 - 定义文本框- 定义发送事件 textarea accesskey =t oninput="sendmsg();"- ...

  5. KnockoutJS(3)-绑定语法

    绑定语法大致分为2种: 1. 数据绑定(data-bind syntax) 2. 绑定上下文(Binding Context) 下面针对这2中绑定语法分别介绍一下 1. 绑定上下文(Binding C ...

  6. JavaScript 风格指导(Airbnb版)

    JavaScript 风格指导(Airbnb版) 用更合理的方式写 JavaScript 原文 翻译自 Airbnb JavaScript Style Guide . 目录 类型 引用 对象 数组 解 ...

  7. 生产场景NFS共享存储优化及实战

    生产场景NFS共享存储优化: 1.硬件:sas/ssd磁盘,买多块,raid0/raid10,网卡好 2.NFS服务器端优化加all_squash,async /backup/NFS 192.168. ...

  8. 【Java】Linux下安装配置Oracle JDK 1.7版本

    1 环境 Vmware虚拟机中的Ubuntu 12.04 32位系统 2具体安装步骤 ①下载最新的jdk包 注意jdk区分32位版本和64位版本,要与Ubuntu兼容才行 下载地址 http://ww ...

  9. matlab之点运算基本思想及几何平移变换

    1.对数变换可以增强图像中较暗部分的细节,因为对数可以将较小的值放大,而较大的值缩小 2.伽马变换:y = (x + esp) ^ γ,x,y的取值范围是0到1,esp是补偿系数,γ为伽马系数.γ的不 ...

  10. Oracle分析函数 — rank, dense_rank, row_number用法

    本文通过例子演示了Oracle分析函数 —— rank, dense_rank, row_number的用法. //首先建score表 create table score( course   nva ...