ural 2032 Conspiracy Theory and Rebranding

链接:https://vjudge.net/contest/175269#problem/I

题意:给定一个三角形的三条边 (a, b, c),问是否可放在二维坐标,使得3个顶点都是整数点。若可以,输出任意一组解,否则,输出 -1。

思路:暴力枚举:以 a 为半径做第一象限的 1/4 圆, 以 b 为半径做 一、四 象限的半圆,存储整数点的解,暴力枚举 a 整数点与 b 整数点是否构成长度为 c 的边。

其实网上还有其他用本源勾股数组做的,但需要分类比较麻烦

#include <iostream>
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
struct node
{
    int x,y;
}aa[100010],bb[100010];
int main()
{
    while(~scanf("%d%d%d",&a,&b,&c))
    {
        int i,j,y;
        int k1 = 0,k2 = 0;
        //找出在第一象限1/4圆上的整点
        for(int i=0;i<=a;i++)
        {
            y = (int)sqrt(a*1.0*a-i*1.0*i);
            if(y*y+i*i==a*a)
            {
                aa[k1].x=i;
                aa[k1].y=y;
                k1++;
            }
        }
        //找出在第一,四象限半圆上的整点
        for(int i=-b;i<=b;i++)
        {
            y=(int)sqrt(b*1.0*b-i*1.0*i);
            if(y*y+i*i==b*b)
            {
                bb[k2].x = i;
                bb[k2].y = y;
                k2++;
            }
        }
        int flag = 0;
        //验证两点之间距离是否等于第三条边
        for(int i=0;i<k1;i++)
        {
            if(flag)break;
            for(int j=0;j<k2;j++)
            {
                if(abs(aa[i].x-bb[j].x)*abs(aa[i].x-bb[j].x)+abs(aa[i].y-bb[j].y)*(abs(aa[i].y-bb[j].y))==c*c)
                {
                    flag = 1;
                    printf("0 0\n%d %d\n%d %d\n",aa[i].x,aa[i].y,bb[j].x,bb[j].y);
                    break;
                }
            }
        }
        if(!flag)printf("-1\n");
    }
    return 0;
}