Google code jam 2008 beta A Triangle Trilemma

#include <cstdlib>

#include <iostream>

#define X 0

#define Y 1

using namespace std;



typedef int pointi[2];

int AreaSign(pointi a, pointi b, pointi c)

{

    double x1 = b[X]-a[X], x2 = c[X]-a[X],

        y1 = b[Y]-a[Y], y2 = c[Y]-a[Y];

    double area2 = x1*y2 - x2*y1 ;

    int res = area2 == 0 ? 0 : (area2 > 0 ? 1 : -1);

    return res; 

}



bool Left(pointi a, pointi b, pointi c)

{

     return AreaSign(a, b, c) > 0;

}



/**

return vlaue meaning:

       0: right

       -1: obtuse

       1: acute

**/

int Angle(pointi a, pointi b, pointi c)

{

     pointi d; int rev = 1;

     if (Left(a, b, c))

     {

        d[X] = a[X] - b[Y] + a[Y];

        d[Y] = a[Y] + b[X] - a[X];

        rev = -1;

     }

     else

     {

         d[X] = a[X] + b[Y] - a[Y];

         d[Y] = a[Y] - b[X] + a[X];

     }

     int r = rev*AreaSign(a, d, c);

     return r; 

}



void Judge(pointi a, pointi b, pointi c)

{

     if (AreaSign(a, b, c) == 0)

     {

          cout<<"not a triangle"<<endl;

          return;

     }     

     int angle;

     int A = Angle(a, b, c), B = Angle(b, c, a), C = Angle(c, a, b);

     if (A == -1 || B == -1 || C==-1) angle =  -1;

     else if (A == 0 || B==0 || C==0) angle = 0;

     else angle = 1;

     bool isosceles=false;

     

     int a2 = (b[X]-c[X])*(b[X]-c[X]) + (b[Y]-c[Y])*(b[Y]-c[Y]),

         b2 = (a[X]-c[X])*(a[X]-c[X]) + (a[Y]-c[Y])*(a[Y]-c[Y]),

         c2 = (b[X]-a[X])*(b[X]-a[X]) + (b[Y]-a[Y])*(b[Y]-a[Y]);

     if (a2 == b2 || a2 == c2 || c2 == b2 ) isosceles = true;

     

     if (isosceles) cout<<"isosceles ";

     else cout<<"scalene ";

     if (angle == 0) cout<<"right ";

     else if (angle == 1) cout<<"acute ";//锐角 

     else cout<<"obtuse ";//钝角 

     cout<<"triangle"<<endl;

}



int main(int argc, char *argv[])

{

    int t = 1;

    int n;

    pointi a, b, c;

    cin>>n;

    for (int i = 1; i <= n; i++)

    {

       cin>>a[X]>>a[Y]>>b[X]>>b[Y]>>c[X]>>c[Y];

       cout<<"Case #"<<i<<": ";

       Judge(a, b, c);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值