I——皮克定理求三角形面积、各边的点数、内部的点数

链接:https://www.nowcoder.net/acm/contest/75/I
来源:牛客网

题目描述

 

给你一个三角形的顶点A,B,C的坐标(坐标都为整数),请求出三角形的面积,三角形内的点的个数以及边AB、BC和AC边上的点的个数(不包括顶点ABC)

输入描述:

多组输入
每组输入三行,每行两个整数
第一行顶点A的坐标Xa,Ya.
第二行顶点B的坐标Xb,Yb.
第三行顶点C的坐标Xc,Yc.
0<=X,Y<=1,000,000
输入-1结束输入

输出描述:

每组输出一行,输出一个实数(保留一位小数),四个整数,分别代表三角形面积,三角形内的点的个数以及边AB、BC和AC边上的点的个数,每个数用空格隔开。
示例1

输入

0 0
2 0
0 2
0 0
3 0
0 3
-1

输出

2.0 0 1 1 1
4.5 1 2 2 2

说明

第一组图一,第二组图二
题意:这里求三角形内的点的个数以及边AB、BC和AC边上的点的个数就要运用皮克定理CLICK HERE
S=a + b/2 -1;
(其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积)

1.给出三点(x1, y1) (x2, y2) (x3, y3)求三角形面积,利用叉乘公式 S = abs(((x2-x1) * (y3-y1) - (x3-x1) * (y2-y1)) / 2),abs为取绝对值
2.给出两点(x1, y1) (x2, y2),求这两点组成得线段间整数坐标点得个数 b = gcd(abs(x1 - x2),abs(y1 - y2)),gcd为最大公约数

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4   
 5 int gcd(long long  a,long long  b)
 6 {
 7     return b==0?a:gcd(b,a%b);
 8 }
 9 
10 struct node
11 {
12     long double x,y;
13 };
14 int main()
15 {
16     node a,b,c;
17     while(cin>>a.x&&a.x!=-1)
18     {
19         cin>>a.y>>b.x>>b.y>>c.x>>c.y;
20          double S=abs((a.x*b.y-a.y*b.x+ b.x*c.y-b.y*c.x+c.x*a.y-c.y*a.x)/2);
21         ll l1=(gcd(abs(b.x-a.x),abs(b.y-a.y)))-1;
22         ll l2=(gcd(abs(c.x-b.x),abs(c.y-b.y)))-1;
23         ll l3=(gcd(abs(c.x-a.x),abs(c.y-a.y)))-1;
24         ll in=S+1-((l1+l2+l3+3))/2;
25         printf("%.1lf ",S);
26         cout<<in<<' '<<l1<<' '<<l2<<' '<<l3<<endl;       
27     }
28     return 0;
29 }

 

posted @ 2018-02-04 20:08  明楼  阅读(1142)  评论(0)    收藏  举报