三角形
题意:
给你一个三角形的顶点A,B,C的坐标(坐标都为整数),请求出三角形的面积,三角形内的点的个数以及边AB、BC和AC边上的点的个数(不包括顶点ABC)
多组输入
每组输入三行,每行两个整数
第一行顶点A的坐标Xa,Ya.
第二行顶点B的坐标Xb,Yb.
第三行顶点C的坐标Xc,Yc.
0<=X,Y<=1,000,000
输入-1结束输入
思路:
通过观察规律可以发现:
1.面积可以利用差积来求
2.各边上包含的点的个数==gcd(x2-x1,y2-y1)-1.
代码:
#include <bits/stdc++.h>
const double PI=acos(-1.0);
#define lowbit(x) (x&-x);
typedef long long LL;
using namespace std;
LL gcd(LL a,LL b)
{
return b==0?a:gcd(b,a%b);
}
struct Point{
LL x,y;
Point(LL x=0,LL y=0):x(x),y(y){}
};
//计算差积
double xmult(Point p1,Point p2,Point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int main()
{
LL xa,ya,xb,yb,xc,yc;
while(cin>>xa && xa!=-1)
{
cin>>ya;
cin>>xb>>yb>>xc>>yc;
Point a,b,c;
a.x=xa,a.y=ya,b.x=xb,b.y=yb,c.x=xc,c.y=yc;
LL s=abs(xmult(a,b,c));
cout<<fixed<<setprecision(1)<<s*1.0/2<<" ";
LL ab=gcd(abs(xa-xb),abs(ya-yb))-1;
LL ac=gcd(abs(xa-xc),abs(ya-yc))-1;
LL bc=gcd(abs(xb-xc),abs(yb-yc))-1;
LL i=(s-(ab+ac+bc+3)+2)/2;
cout<<i<<" "<<ab<<" "<<bc<<" "<<ac<<endl;
}
return 0;
}
小马过河
题意:
众所周知,这个问题中有一匹口渴的小马,一条笔直的河,以及小马的家。小马需要去河边喝水,然后再去家里。它需要走最短的路径。
他不会做这个。他想请你帮他作一条过小马家且垂直于河水的线,然后告诉他垂足的位置。
思路:
发现本题求的就是直线外一点在直线上的投影点。
直接写出这个函数的模板即可
代码:
#include <cstdio>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
struct Point{
double x,y;
Point(double x=0,double y=0):x(x),y(y)
{
}
};
typedef Point Vector;
Vector operator +(Vector A,Vector B)
{
return Vector(A.x+B.x,A.y+B.y);
}
Vector operator -(Vector A,Vector B)
{
return Vector(A.x-B.x,A.y-B.y);
}
Vector operator *(Vector A,double p)
{
return Vector(A.x*p,A.y*p);
}
Vector operator /(Vector A,double p)
{
return Vector(A.x/p,A.y/p);
}
const double eps=1e-10;
int dcmp(double x)
{
if(fabs(x)<eps) return 0;
else
return x<0?-1:1;
}
double Dot(Vector A,Vector B)
{
return A.x*B.x+A.y*B.y;
}
double Length(Vector A)
{
return sqrt(Dot(A,A));
}
double Cross(Vector A,Vector B)
{
return A.x*B.y-A.y*B.x;
}
Point GetLineProjection(Point P,Point A,Point B)
{
Vector v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
Point P,A,B;
scanf("%lf%lf%lf%lf%lf%lf",&P.x,&P.y,&A.x,&A.y,&B.x,&B.y);
Vector Q=GetLineProjection(P,A,B);
printf("%.7f %.7f\n",Q.x,Q.y);
}
return 0;
}