题目链接---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
说明
第一组图一,第二组图二
1,皮克公式:S = 1/2×(( X1*Y2-X2*Y1) + … + (Xk*Yk+1-Xk+1*Yk )+...+( Xn*Y1-X1*Yn )) 用于求多边形的面积
需要注意的是,如果一系列点按逆时针排列算出的是正面积,而如果是顺时针的话算出的则是一个负面积。
2,多边形边上的点:gcd(边的横向长度,边的纵向长度)这里的gcd是欧几里得算法,前面已经讲过
3,多边形内部的点:S=n+s/2-1;其中n表示多边形内部的点数,s表示多边形边界上的点数,S表示多边形的面积
注意:这道题定义变量时要用long long ,我做这道题的时候忽略了这个细节,做了几遍才做对
我们来看一下这道题代码的实现:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
long long gcd(long long a,long long b)
{
if(b==0)
return a;
long long re=gcd(b,a%b);
return re;
}
int main()
{
long long xa,ya,xb,yb,xc,yc;
while(cin>>xa)
{
if(xa==-1) break;
cin>>ya;
cin>>xb>>yb;
cin>>xc>>yc;
double s;
s=abs(((xa*yb-xb*ya)+(xb*yc-xc*yb)+(xc*ya-xa*yc))/2.0);
long long a,b,c;
a=gcd(abs(xa-xb),abs(ya-yb))-1;
b=gcd(abs(xc-xb),abs(yc-yb))-1;
c=gcd(abs(xa-xc),abs(ya-yc))-1;
long long k=1.0+s-(a+b+c+3.0)/2.0;
printf("%.1lf ",s);
cout<<k<<" "<<a<<" "<<b<<" "<<c<<endl;
}
return 0;
}