Topcoder_13

【问题描述】
    给定一组坐标(x,y)需要计算能组成多少个不同直角等腰三角形。(两个三角形至少有一个顶点不同才认为不同)

  定义
类  Isoceles
方法  public int howMany(int[] xs, int[] ys)

  约束:
1、xs[K]和ys[K]分别为顶点的x和y坐标值
2、xs和ys数组均包含3至50(包括)个元素,且两数组大小相同
3、每个坐标值元素取值在[-1000000,1000000]
4、给定的一些列点中不包含重复的顶点

  测试用例:
1、{0,1,2}
{0,10,0}
Returns: 0
2、{0,0,5,5}
{0,5,0,5}
Returns: 4
3、{-1000000,1000000,0}
{0,0,1000000}
Returns: 1
  1. public class Isoceles {
  2.     public int howMany(int[] xs, int[] ys){
  3.         int count=0;
  4.         long[] xcorner = new long[3];
  5.         long[] ycorner = new long[3];
  6.         for(int i=0; i<xs.length; i++){
  7.             for(int k=i+1;k<xs.length; k++){
  8.                 for(int n=k+1; n<xs.length; n++){
  9.                     xcorner[0]=xs[i];
  10.                     ycorner[0]=ys[i];
  11.                     xcorner[1]=xs[k];
  12.                     ycorner[1]=ys[k];
  13.                     xcorner[2]=xs[n];
  14.                     ycorner[2]=ys[n];
  15.                     count+=checkAndCal(xcorner,ycorner);
  16.                 }
  17.             }
  18.         }
  19.         return count;
  20.     }
  21.     
  22.     private int checkAndCal(long[] xc, long[] yc){
  23.         double a,b,c;
  24.         double a2,b2,c2;
  25.         a2 = (xc[0]-xc[1])*(xc[0]-xc[1])+(yc[0]-yc[1])*(yc[0]-yc[1]);
  26.         b2 = (xc[1]-xc[2])*(xc[1]-xc[2])+(yc[1]-yc[2])*(yc[1]-yc[2]);
  27.         c2 = (xc[2]-xc[0])*(xc[2]-xc[0])+(yc[2]-yc[0])*(yc[2]-yc[0]);
  28.         a=Math.sqrt(a2);
  29.         b=Math.sqrt(b2);
  30.         c=Math.sqrt(c2);
  31.         if(a+b<=c || a+c<=b || b+c<=a)
  32.             return 0;
  33.         if(!(a==b || b==c || a==c))
  34.             return 0;
  35.         if(!(a2+b2==c2 || b2+c2==a2 || a2+c2==b2))
  36.             return 0;
  37.         return 1;
  38.     }
  39. }
【算法思想】
    按部就班地按照是否为三角形、是否等腰、是否直角来进行检验,需要注意的是计算边长平方的时候需要使用long型变量(int型会溢出)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值