【问题描述】
给定一组坐标(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
【算法思想】
按部就班地按照是否为三角形、是否等腰、是否直角来进行检验,需要注意的是计算边长平方的时候需要使用long型变量(int型会溢出)。
给定一组坐标(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
- public class Isoceles {
- public int howMany(int[] xs, int[] ys){
- int count=0;
- long[] xcorner = new long[3];
- long[] ycorner = new long[3];
- for(int i=0; i<xs.length; i++){
- for(int k=i+1;k<xs.length; k++){
- for(int n=k+1; n<xs.length; n++){
- xcorner[0]=xs[i];
- ycorner[0]=ys[i];
- xcorner[1]=xs[k];
- ycorner[1]=ys[k];
- xcorner[2]=xs[n];
- ycorner[2]=ys[n];
- count+=checkAndCal(xcorner,ycorner);
- }
- }
- }
- return count;
- }
- private int checkAndCal(long[] xc, long[] yc){
- double a,b,c;
- double a2,b2,c2;
- a2 = (xc[0]-xc[1])*(xc[0]-xc[1])+(yc[0]-yc[1])*(yc[0]-yc[1]);
- b2 = (xc[1]-xc[2])*(xc[1]-xc[2])+(yc[1]-yc[2])*(yc[1]-yc[2]);
- c2 = (xc[2]-xc[0])*(xc[2]-xc[0])+(yc[2]-yc[0])*(yc[2]-yc[0]);
- a=Math.sqrt(a2);
- b=Math.sqrt(b2);
- c=Math.sqrt(c2);
- if(a+b<=c || a+c<=b || b+c<=a)
- return 0;
- if(!(a==b || b==c || a==c))
- return 0;
- if(!(a2+b2==c2 || b2+c2==a2 || a2+c2==b2))
- return 0;
- return 1;
- }
- }
按部就班地按照是否为三角形、是否等腰、是否直角来进行检验,需要注意的是计算边长平方的时候需要使用long型变量(int型会溢出)。