Triangle - POJ 2954(求三角形内的格子点的个数)

Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1。

代码如下:

----------------------------------------------------------------------------------------------------------------------------

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
#include<math.h>
using namespace std;

const int MAXN = 17;
const double EPS = 1e-10;

struct point
{
    int x, y;
}p[MAXN];

int GCD(int m, int n)
{
    if(!m || !n)
        return m+n;
    return GCD(n, m%n);
}

int main()
{
    while(1)
    {
        int ok=0;

        for(int i=0; i<3; i++)
        {
            scanf("%d%d", &p[i].x, &p[i].y);
            if(p[i].x || p[i].y)
                ok = 1;
        }

        if(!ok)break;
        p[3] = p[0];

        int cnt=0, area=0;

        for(int i=0; i<3; i++)
        {
            cnt += GCD(abs(p[i].x-p[i+1].x), abs(p[i].y-p[i+1].y));
            area += p[i].x*p[i+1].y - p[i].y*p[i+1].x;
        }
        if(area < 0)area = -area;

        printf("%d\n", (area-cnt)/2+1);
    }

    return 0;
}
时间: 2024-10-13 07:41:15

Triangle - POJ 2954(求三角形内的格子点的个数)的相关文章

HDU 4343 多查询求区间内的最大不相交区间个数-思维&amp;贪心-卡时间&amp;二分&amp;剪枝

题意:给你一些区间,现在有m个查询,求出每个查询的区间内的最大的不相交区间个数 分析: 几天前那道说谎问题时用dp的摞箱子模型求的最大的不相交区间个数,但是这题不能用这个方法,因为这题是动态的查询,不可能每个查询dp一次,超时. 这题用贪心策略.求区间[l~r]里的最大不相交区间,贪心策略就应该先选该区间内右端点最小的,这样给以后待选的区间留下更大的空间,所以我们的做法就是先按照区间的右端点排序,然后每次查询依次挑出查询区间里右端点最小的,并且把查询区间的左端点更新为刚才挑出的区间的右端点(这个

POJ 1265 Area POJ 2954 Triangle Pick定理

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5227   Accepted: 2342 Description Being well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new resear

POJ 2954 Triangle (皮克定理, 三角形叉乘求面积)

Triangle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5303 Accepted: 2297 Description A lattice point is an ordered pair (x, y) where x and y are both integers. Given the coordinates of the vertices of a triangle (which happen to be lat

【POJ 2954】 Triangle

[POJ 2954] Triangle 很涨姿势的一道题 涉及三点 1.三角形算法 已知三点 S = (AB X BC)/2 (PS:海伦公式<已知三边> S = sqrt(p(p-a)(p-b)(p-c) p = (a+b+c)/2) 2.已知两点求两点间格点 即为求两点横纵坐标差的最大公倍数(-1-–不包含顶点) (gcd( abs(x2-x1),abs(y2-y1) ) (-1)) 3.格点多边形的面积 s = d/2+t-1(d->多边形边界的格点数 t->多边形内部格点数

POJ 2761-Feed the dogs(划分树)求区间内第k小的数

Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 17679   Accepted: 5561 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs every day for Wind. Jiajia loves Wind, but not the

POJ 1329 Circle Through Three Points(求三角形的外接圆)

Circle Through Three Points 博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/40985403 题目大意: 给你三个不共线的三个点的坐标,求出过这三个点的圆的方程.写出方程的两种形式. 解题思路: 其实题目要求写出的方程的形式中包含圆心坐标跟半径,所以说关键问题其实就是求出过三点圆的圆心跟半径就OK了. 其实就是个求三角形外接圆的题目,最后加上一些蛋疼的输出控制就可以了. 代码写的有点麻烦,看到Dis

判断点是否在三角形内【转】

概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三角形的三个顶点得到三条线段PA,PB和PC,求出这三条线段与三角形各边的夹角,如果所有夹角之和为180度,那么点P在三角形内,否则不在,此法直观,但效率低下. 二 同向法 假设点P位于三角形内,会有这样一个规律,当我们沿着ABCA的方向在三条边上行走时,你会发现点P始终位于边AB,BC和

判断点是否在三角形内

http://www.cnblogs.com/graphics/archive/2010/08/05/1793393.html#!comments 本文只是翻译和整理,原文在此http://www.blackpawn.com/texts/pointinpoly/default.html 概述 给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内.这是游戏设计中一个常见的问题.需要注意的是,这里假定点和三角形位于同一个平面内. 本文介绍三种不同的方法,由浅入深 一 内角和法 连接点P和三

POJ 2954

PICK定理:格子上的多边形面积=边界上格子点数/2+内部点数-1. 利用叉积求出面积.再枚举边上的点数.然后按公式求出内部点数就可以了. 关于PICK:http://blog.csdn.net/i_fuqiang/article/details/9817343 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm>