1、http://codeforces.com/contest/408/problem/C
2、题目大意:
给出一个直角三角形的两条边长a、b,看能否将这个三角形放到一个二维平面内,使得三条边都不能平行于坐标轴,如果能输出三个点的坐标,否则输出NO
3、思路:
据我目测,可以固定一个点于远点,然后利用相似三角形的关系即可使夹角成90度,但是如图所示,需要满足:
s1*l1==s2*l2,且s2!=l2(防止斜边与X轴平行,起初写的是s1!=l1,然后一直WA)
代码如下:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
#include<math.h>
using namespace std;
struct t1
{
int d;
int h;
}z[5010],y[5010];
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
{
int i,j;
int s1 = 0,s2 = 0;
for(i = 1;i < a; i++)
for(j = 1;j < a; j++)
{
if(i * i + j * j == a * a)
{
z[s1].d = i;
z[s1].h = j;
s1++;
}
}
for(i = 1;i < b; i++)
for(j = 1;j < b; j++)
{
if(i * i + j * j == b * b)
{
y[s2].d = i;
y[s2].h = j;
s2++;
}
}
int flag = 0;
int z1,z2,y1,y2;
for(i = 0;i < s1; i++)
{
for(j = 0;j < s2; j++)
if(z[i].d * y[j].d == z[i].h * y[j].h && z[i].h != y[j].h)
{
flag = 1;
z1 = z[i].d;
z2 = z[i].h;
y1 = y[j].d;
y2 = y[j].h;
break;
}
if(flag) break;
}
if(flag)
printf("YES\n0 0\n%d %d\n%d %d\n",-z1,z2,y1,y2);
else
printf("NO\n");
}
return 0;
}