题型:计算几何
题意:给出三角形的三条边,问该三角形的三个顶点能否是直角坐标系中的整数格点。
分析:
设一个顶点在原点,然后作一个长度为a的圆和一个长度为b的圆,暴力求解圆上有多少个整数格点。然后枚举圆a上的整数格点和圆b上的整数格点,看距离是否为c,有的话直接输出,最后也没找到就输出-1.
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<vector>
#define LL __int64
using namespace std;
struct Point {
int x,y;
Point(int x = 0 , int y = 0)
:x(x),y(y) {}
void out() {
printf("%d %d\n",x,y);
}
};
vector<Point> v;
LL dist(Point T,Point S) {
return 1LL*(T.x-S.x)*(T.x-S.x)+1LL*(T.y-S.y)*(T.y-S.y);
}
int main() {
int a,b,c;
while(~scanf("%d%d%d",&a,&b,&c)) {
Point O(0,0);
v.clear();
for(int i=0; i<=a; i++) {
LL tmp = 1LL*a*a - 1LL*i*i;
int j = sqrt(tmp+0.0);
if(1LL*j*j != tmp) j++;
if(1LL*j*j != tmp) continue;
v.push_back(Point(i,j));
}
Point B;
for(int i=0; i<=b; i++) {
LL tmp = 1LL*b*b - 1LL*i*i;
int j = sqrt(tmp+0.0);
if(1LL*j*j != tmp) j++;
if(1LL*j*j != tmp) continue;
B = Point(i,j);
for(int k=0; k<v.size(); k++) {
if(dist(v[k],B) == 1LL*c*c) {
O.out();
B.out();
v[k].out();
return 0;
}
}
B = Point(i,-j);
for(int k=0; k<v.size(); k++) {
if(dist(v[k],B) == 1LL*c*c) {
O.out();
B.out();
v[k].out();
return 0;
}
}
B = Point(-i,j);
for(int k=0; k<v.size(); k++) {
if(dist(v[k],B) == 1LL*c*c) {
O.out();
B.out();
v[k].out();
return 0;
}
}
B = Point(-i,-j);
for(int k=0; k<v.size(); k++) {
if(dist(v[k],B) == 1LL*c*c) {
O.out();
B.out();
v[k].out();
return 0;
}
}
}
puts("-1");
}
return 0;
}