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;
    }
  • 相关阅读:
    小技巧
    常用的交互设计软件
    Android studio 使用SVN需要忽略的文件
    android studio 使用SVN 锁定文件,防止别人修改(基于Android studio 1.4 )
    git 和 github 关系?
    Double 数据保留两位小数一:五舍六入
    设计模式
    Java中关于日期类那些方法
    ios 开源免费接口
    华为招聘机试整理5:简单四则运算
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793298.html
Copyright © 2011-2022 走看看