zoukankan      html  css  js  c++  java
  • 【POJ2954】Triangle-Pick定理

    测试地址:Triangle
    题目大意:求处在一个三顶点都在整点上的三角形严格内部的整点数目。
    做法:本题需要用到Pick定理。
    Pick定理是一个很有趣的定理,对于任意一个顶点都在整点上的简单多边形,都有:
    S为多边形面积,P为多边形严格内部的整点数目,P为多边形边上的整点数目,那么S=P+P21
    这个定理的证明就不详细写了,主要思路是:
    1.证明任意边平行于坐标轴的矩形满足定理。
    2.证明任意直角边平行于坐标轴的直角三角形满足定理(将一个1中的矩形拆开)。
    3.证明任意三角形满足定理(任意三角形可以由3个以内的2中的直角三角形拼出)。
    4.证明任意简单多边形满足定理(可以用数学归纳法,先证明一个简单多边形加上一个三角形满足定理,而任意简单多边形都有一个三角剖分)。
    于是回到这题,我们有:
    P=SP2+1
    S直接叉积算即可,主要是P。对于两个整点,令它们x坐标的差距为Δxy坐标的差距为Δy,分类讨论:
    ΔxΔy其中之一为0,那么它们之间线段(不包括顶点)上的点数是它们之中不为0的那一个1
    否则,它们之间线段(不包括顶点)上的点数为gcd(Δx,Δy)1
    这样我们就解决了这一题。
    以下是本人代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a,b,c,d,e,f;
    
    int multi(int a,int b,int c,int d,int e,int f)
    {
        int x1=c-a,y1=d-b,x2=e-a,y2=f-b;
        return x1*y2-x2*y1;
    }
    
    int gcd(int a,int b)
    {
        return b?gcd(b,a%b):a;
    }
    
    int dis(int x1,int y1,int x2,int y2)
    {
        if (x1==x2) return abs(y1-y2)-1;
        if (y1==y2) return abs(x1-x2)-1;
        return gcd(abs(x1-x2),abs(y1-y2))-1;
    }
    
    int main()
    {
        while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f))
        {
            if (a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break;
            int S=abs(multi(a,b,c,d,e,f)),D=3;
            D+=dis(a,b,c,d);
            D+=dis(a,b,e,f);
            D+=dis(c,d,e,f);
            printf("%d
    ",((S-D)>>1)+1); 
        }
    
        return 0;
    }
  • 相关阅读:
    #define #undef
    ps
    Find–atime –ctime –mtime的用法与区别总结
    redis
    linux mutex
    private继承
    boost::noncopyable介绍
    Makefile 中:= ?= += =的区别
    linux Tar 命令参数详解
    Ubuntu14.04安装CMake3.0.2
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793298.html
Copyright © 2011-2022 走看看