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 }
明楼

浙公网安备 33010602011771号