zoukankan      html  css  js  c++  java
  • POJ 2954 /// 皮克定理+叉积求三角形面积

    题目大意:

    给定三角形的三点坐标

    判断在其内部包含多少个整点

    题解及讲解

    皮克定理

    多边形面积s = 其内部整点in + 其边上整点li / 2 - 1

    那么求内部整点就是 in = s + 1 - li / 2

    网格中两格点(整点)间经过的格点(整点)数 即边上整点

    li +1=两点横向和纵向距离的最大公约数

    //求线段ab之间的整点数
    int lineSeg(P a,P b) {
        int dx=abs(a.x-b.x), dy=abs(a.y-b.y);
        if(dx==0 && dy==0) return 0;
        return gcd(dx,dy)-1;
    }
    #include <cstdio>
    #include <string.h>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    double eps=1e-10;
    double add(double a,double b) {
        if(abs(a+b)<eps*(abs(a)+abs(b))) return 0;
        return a+b;
    }
    struct P {
        double x,y;
        P(){};
        P(double _x,double _y):x(_x),y(_y){};
        P operator - (P p) {
            return P(add(x,-p.x),add(y,-p.y)); }
        P operator + (P p) {
            return P(add(x,p.x),add(y,p.y)); }
        P operator * (double d) {
            return P(x*d,y*d); }
        double dot (P p) {
            return add(x*p.x,y*p.y); }
        double det (P p) {
            return add(x*p.y,-y*p.x); }
    }a,b,c;
    double area(P a,P b,P c) {
        return abs((a-c).det(b-c))/2;
    }
    int gcd(int a,int b) {
        while(b) {
            int t=a%b;
            a=b; b=t;
        } return a;
    }
    //求线段ab之间的整点数
    int lineSeg(P a,P b) {
        int dx=abs(a.x-b.x), dy=abs(a.y-b.y);
        if(dx==0 && dy==0) return 0;
        return gcd(dx,dy)-1;
    }
    
    int main()
    {
        while(~scanf("%lf%lf%lf%lf%lf%lf"
                     ,&a.x,&a.y,&b.x,&b.y,&c.x,&c.y)) {
            if(a.x==a.y && b.x==b.y && c.x==c.y
               && a.x==b.x && b.x==c.x && c.x==0) break;
            int s=area(a,b,c);
            int li=lineSeg(a,b)+lineSeg(a,c)+lineSeg(b,c)+3;
            // +3 是 加上三角形的三个顶点
            printf("%d
    ",s+1-li/2); /// 皮克定理
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    Eclipse下,修改MAVEN 中央仓库地址,解决maven下载慢问题
    C语言中头文件string的用法
    Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义
    Curl
    LDAP是什么
    Linux网络基本网络配置
    vim
    request,session,cookie的比较
    J2EE开发过程中遇到的问题
    实现弹出登录窗口
  • 原文地址:https://www.cnblogs.com/zquzjx/p/9672131.html
Copyright © 2011-2022 走看看