基本思路:因为要构成直角三角形都必须是整数坐标,
所以首先需要判断,给定的2条直角边是否可以用平行
于x轴和y轴的整数线段构成以这条直角边为斜边的直
角三角形。然后这里的代码是把(0, 0) 当作公共点输出
的,所以就剩下求4种情况的分析了,具体看代码。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
struct Point{
int x, y;
};
int squa[1000005];
//求1-1000的平方,标记
void init()
{
memset(squa, 0, sizeof(squa));
for(int i = 0; i < 1001; i ++)
squa[i*i] = 1;
}
int main()
{
int a, b;
scanf("%d%d", &a, &b);
init();
//以(0, 0)作为直角三角形直角的公共点
bool flag1 = false; //判断直角边a能否成为平行于X, Y轴整数直角边的斜边
bool flag2 = false; //判断直角边b, 同上
Point pt1[100]; //保存直角边a所有的可能作为斜边时的坐标点
Point pt2[100]; //保存直角边b, 同上
int n1 = 0; //pt1的个数
int n2 = 0; //pt2的个数
//求所有构成直角边a为斜边的坐标
for(int i = 1; i < a; i ++)
if(squa[a*a - i*i]) {
pt1[n1].x = i;
pt1[n1++].y = sqrt(a*a - i*i);
flag1 = true;
}
//求所有构成直角边b为斜边的坐标
for(int i = 1; i < b; i ++)
if(squa[b*b - i*i]) {
flag2 = true;
pt2[n2].x = i;
pt2[n2++].y = sqrt(b*b - i*i);
}
//如果都可以作为斜边,有可能存在解
if(flag1 && flag2){
do{
bool flag = false;
for(int i = 0; i < n1; i ++)
for(int j = 0; j < n2; j ++){
//分成4种情况判断, 比如假设给定5,5
//那么2个求出的都是(3, 4),注意(0, 0)一定是其中一个点
//但是(4, 3)也是其中的情况,还有二者必须在相邻象限
//同时可能存在求出的x相等或者y相等,这样就会导致平行坐标轴,所以第三第四种情况是讨论这些
int c = (pt1[i].x-pt2[j].x)*(pt1[i].x-pt2[j].x) + (pt1[i].y+pt2[j].y)*(pt1[i].y+pt2[j].y);
if(a * a + b * b == c){
printf("YES\n");
printf("0 0\n");
if(pt1[i].x != pt2[j].x)
{
printf("%d %d\n", pt1[i].x, pt1[i].y);
printf("%d -%d\n", pt2[j].x, pt2[j].y);
}
else{
printf("-%d %d\n", pt1[i].x, pt1[i].y);
printf("%d %d\n", pt2[j].x, pt2[j].y);
}
goto L;
break;
}
int c1 = (pt1[i].x-pt2[j].y)*(pt1[i].x-pt2[j].y) + (pt1[i].y+pt2[j].x)*(pt1[i].y+pt2[j].x);
if(a * a + b * b == c1){
printf("YES\n");
printf("0 0\n");
if(pt1[i].x != pt2[j].y){
printf("%d %d\n", pt1[i].x, pt1[i].y);
printf("%d -%d\n", pt2[j].y, pt2[j].x);
}
else{
printf("-%d %d\n", pt1[i].x, pt1[i].y);
printf("%d %d\n", pt2[j].y, pt2[j].x);
}
goto L;
break;
}
int c2 = (pt1[i].x+pt2[j].x)*(pt1[i].x+pt2[j].x) + (pt1[i].y-pt2[j].y)*(pt1[i].y-pt2[j].y);
if(a * a + b * b == c2){
printf("YES\n");
printf("0 0\n");
if(pt1[i].y != pt2[j].y)
{
printf("%d %d\n", pt1[i].x, pt1[i].y);
printf("-%d %d\n", pt2[j].x, pt2[j].y);
}
else{
printf("%d -%d\n", pt1[i].x, pt1[i].y);
printf("%d %d\n", pt2[j].x, pt2[j].y);
}
goto L;
break;
}
int c3 = (pt1[i].x+pt2[j].y)*(pt1[i].x+pt2[j].y) + (pt1[i].y-pt2[j].x)*(pt1[i].y-pt2[j].x);
if(a * a + b * b == c3){
printf("YES\n");
printf("0 0\n");
if(pt1[i].y != pt2[j].x){
printf("%d %d\n", pt1[i].x, pt1[i].y);
printf("-%d %d\n", pt2[j].y, pt2[j].x);
}
else{
printf("%d -%d\n", pt1[i].x, pt1[i].y);
printf("%d %d\n", pt2[j].y, pt2[j].x);
}
goto L;
break;
}
}
printf("NO\n");
break;
}while(1);
}
else{
printf("NO\n");
}
L:
return 0;
}