CF 407A Triangle

基本思路:因为要构成直角三角形都必须是整数坐标,

所以首先需要判断,给定的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;
}


你可能感兴趣的:(枚举,规律)