URAL_2032_Conspiracy Theory and Rebranding(暴力枚举)

来源:互联网 发布:西安交大软件学院院长 编辑:程序博客网 时间:2024/06/04 08:54

题型:计算几何


题意:给出三角形的三条边,问该三角形的三个顶点能否是直角坐标系中的整数格点。


分析:

设一个顶点在原点,然后作一个长度为a的圆和一个长度为b的圆,暴力求解圆上有多少个整数格点。然后枚举圆a上的整数格点和圆b上的整数格点,看距离是否为c,有的话直接输出,最后也没找到就输出-1.


代码:

#include<iostream>#include<cstring>#include<cstdio>#include<cmath>#include<vector>#define LL __int64using namespace std;struct Point {    int x,y;    Point(int x = 0 , int y = 0)        :x(x),y(y) {}    void out() {        printf("%d %d\n",x,y);    }};vector<Point> v;LL dist(Point T,Point S) {    return 1LL*(T.x-S.x)*(T.x-S.x)+1LL*(T.y-S.y)*(T.y-S.y);}int main() {    int a,b,c;    while(~scanf("%d%d%d",&a,&b,&c)) {        Point O(0,0);        v.clear();        for(int i=0; i<=a; i++) {            LL tmp = 1LL*a*a - 1LL*i*i;            int j = sqrt(tmp+0.0);            if(1LL*j*j != tmp) j++;            if(1LL*j*j != tmp) continue;            v.push_back(Point(i,j));        }        Point B;        for(int i=0; i<=b; i++) {            LL tmp = 1LL*b*b - 1LL*i*i;            int j = sqrt(tmp+0.0);            if(1LL*j*j != tmp) j++;            if(1LL*j*j != tmp) continue;            B = Point(i,j);            for(int k=0; k<v.size(); k++) {                if(dist(v[k],B) == 1LL*c*c) {                    O.out();                    B.out();                    v[k].out();                    return 0;                }            }            B = Point(i,-j);            for(int k=0; k<v.size(); k++) {                if(dist(v[k],B) == 1LL*c*c) {                    O.out();                    B.out();                    v[k].out();                    return 0;                }            }            B = Point(-i,j);            for(int k=0; k<v.size(); k++) {                if(dist(v[k],B) == 1LL*c*c) {                    O.out();                    B.out();                    v[k].out();                    return 0;                }            }            B = Point(-i,-j);            for(int k=0; k<v.size(); k++) {                if(dist(v[k],B) == 1LL*c*c) {                    O.out();                    B.out();                    v[k].out();                    return 0;                }            }        }        puts("-1");    }    return 0;}


0 0
原创粉丝点击