题目: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 -3

Sample Output

Scenario #1:
0 4 1.0 Scenario #2:
12 16 19.0 注意:题目给出的成对的数可不是坐标,是在x和y方向走的数量。
边界上的格点数:一条左开右闭的线段(x1, x2)->(x2, y2)上的格点数为:gcd( abs(x2-x1), abs(y2-y1) );
Pick公式:对于给定的坐标都是整点的简单多边形,有如下等式:
多边形面积=多边形内部格点数+边上的格点数/2 - 1; 由此可以推出如何计算多边形内部的格点数量!
当然这需要知道多边形的面积,计算多边形的面积:顺时针或逆时针相邻两点分别与原点构成的向量的叉积累加和,再取绝对值,再除2
(因为顺逆方向的问题,可能会导致叉积累加和为负,又因为叉积计算的是向量围成的四边行的面积所以还要除2) 代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <iostream>
#include <string>
#include <algorithm> using namespace std; struct node
{
int x;
int y;
}q[110]; int cal_area(node a, node b)
{
return a.x*b.y-a.y*b.x;
} //叉积计算两个向量的面积 int gcd(int a, int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int tg; scanf("%d", &tg);
int n;
int i, j;
for(int cnt=1; cnt<=tg; cnt++){
scanf("%d", &n);
q[0].x=0; q[0].y=0; //这是坐标原点 int p_on_l=0; //point on line for(i=1; i<=n; i++){
scanf("%d %d", &q[i].x, &q[i].y );
//先计算线段上的点数
int dx=abs(q[i].x);
int dy=abs(q[i].y);
p_on_l+=gcd(dx, dy); q[i].x+=q[i-1].x;
q[i].y+=q[i-1].y; //题目中给出的是前一个点在x y方向上行走的数量
} //只要累加就可以计算出i节点的坐标
//所有点的坐标计算完毕
int area=0;
for(i=2; i<=n; i++){
area+=cal_area(q[i], q[i-1]);
}
area=abs(area); //多边行的面积一定大于等于0 如果求出的结果为负值
//说明叉积计算的方向是和正值计算相比是反的
double ans=area/2.0;//叉积计算的是平行四边行的面积 不是三角形 面积要减半 printf("Scenario #%d:\n", cnt);
printf("%d %d %.1lf\n", (area/2+1-p_on_l/2), p_on_l, ans);
printf("\n");
}
return 0;
}
												

poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】的更多相关文章

  1. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

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

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

  3. 2018.07.04 POJ 1265 Area(计算几何)

    Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...

  4. poj 1265 Area (Pick定理+求面积)

    链接:http://poj.org/problem?id=1265 Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  5. poj 1265 Area(pick定理)

    Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4373 Accepted: 1983 Description Bein ...

  6. POJ 1265 Area POJ 2954 Triangle Pick定理

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

  7. POJ 1265 Area (pick定理)

    题目大意:已知机器人行走步数及每一步的坐标变化量,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:叉积求面积,pick定理求点. pick定理:面积=内部点数+边上点数/2-1 ...

  8. [poj 1265]Area[Pick定理][三角剖分]

    题意: 给出机器人移动的向量, 计算包围区域的内部整点, 边上整点, 面积. 思路: 面积是用三角剖分, 边上整点与GCD有关, 内部整点套用Pick定理. S = I + E / 2 - 1 I 为 ...

  9. poj 1265 Area(Pick定理)

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5666   Accepted: 2533 Description ...

随机推荐

  1. 高通音频 媒体喇叭增益隐藏参数(一个QACT无法修改的参数)

    源文件位置:modem_proc\multimedia\audio\avs\src\sndhwg2.c sndhw_init()函数,2520行左右:pm_set_speaker_gain(PM_SP ...

  2. JS原生追加子节点

    var fragment = document.createDocumentFragment(); li = document.createElement('li'); li.className = ...

  3. [Unity3D]Unity3D游戏开发之伤害数值显示

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...

  4. 生产者——消费者模型的java代码实现

    生产者 import java.util.Random; public class Producer extends Thread { private Storage<Product> s ...

  5. 数组中binarySearch 中小小的误区! 用的时候大家要注意点

  6. setlocale()函数测试当前语言的两个程序

    http://www.cnblogs.com/cnyao/archive/2010/05/06/1729220.html setlocale()函数是用来配置地域信息的,原本以为这个也是windows ...

  7. jquery on 确认删除

    $(document).on('click', '.delbtn', function() {         if (confirm("确定要删除吗?")) {          ...

  8. Mysql 命令详解

    1.读取服务器变量:    show [global|session] variables;2.更改非静态(只读)变量:    set [global|session] <variable_na ...

  9. 74LS85 比較器 【数字电路】

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011368821/article/details/27959219 74LS85 demo: 11 ...

  10. Android测试读写sd卡文件与写sd卡文件耗时

    测试从sd卡读1k大小的文件,再写1k大小的文件,由于处理耗时很短,所以循环500次,查看耗时:测试写1k大小的文件,直接在内存构造一个1k的buffer,将这个buffer直接写到文件,同样循环50 ...