题目:http://codeforces.com/problemset/problem/407/A
题意:给你三角形的两条直角边,求是否存在边不与坐标轴平行的三角形。存在输出三个顶点,否则输出NO。
思路:两点要注意,YES 和NO 是大写,三个顶点形成的是三角形。我的想法是求出两条直角边作为斜边时候,与坐标轴平行的边的长度,那么对应的就会有一个直角梯形。这样就会存在两个求斜边长的公式,如果两个公式都满足的话,就是符合我们要求的。
如图:
ia,ja 和 ib, jb 都不会超过直角边 a 和 b 。
代码如下:
#include <stdio.h>
int main(){
int a, b;
scanf("%d%d", &a, &b);
int ia, ja, ib, jb;
int i, j;
int flag = 0;
i = 1; j = 2;
for(ia = 1; ia < a; ++ia)
for(ja = 1; ja < a; ++ja){
if(ia*ia + ja*ja == a*a){
for(ib = 1; ib < b; ++ib)
for(jb = 1; jb < b; ++jb)
if(ib*ib + jb*jb == b*b){
if(ia != ib){
if((ja+jb)*(ja+jb) + (ia-ib)*(ia-ib) == a*a + b*b){
flag = 1;
goto pt1;
}
}
else if(ia != jb)
if((ib+ja)*(ib+ja) + (ia-jb)*(ia-jb) == a*a + b*b){
flag = 2;
goto pt2;
}
}
}
}
pt1: if(flag == 1){
printf("YES\n");
printf("%d %d\n", i, j);
printf("%d %d\n", i + jb, j + ib);
printf("%d %d\n", i - ja, j + ia);
}
pt2: if(flag == 2){
printf("YES\n");
printf("%d %d\n", i, j);
printf("%d %d\n", i + ib, j + jb);
printf("%d %d\n", i - ja, j + ia);
}
if(!flag)
printf("NO\n");
return 0;
}
其实,有flag判断了就没必要设置两个Label。直接让循环跳出来就行了。