三角形计数

来源:互联网 发布:ubuntu telnet 命令 编辑:程序博客网 时间:2024/05/29 04:12
给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?
样例
例如,给定数组 S = {3,4,6,7},返回 3
其中我们可以找到的三个三角形为:
{3,4,6}
{3,6,7}
{4,6,7}
给定数组 S = {4,4,4,4}, 返回 4
其中我们可以找到的三个三角形为:
{4(1),4(2),4(3)}
{4(1),4(2),4(4)}
{4(1),4(3),4(4)}

{4(2),4(3),4(4)}

import java.util.ArrayList;import java.util.Scanner;/** * 给定一个整数数组,在该数组中,寻找三个数,分别代表三角形三条边的长度,问,可以寻找到多少组这样的三个数来组成三角形?样例例如,给定数组 S = {3,4,6,7},返回 3其中我们可以找到的三个三角形为:{3,4,6}{3,6,7}{4,6,7}给定数组 S = {4,4,4,4}, 返回 4其中我们可以找到的三个三角形为:{4(1),4(2),4(3)}{4(1),4(2),4(4)}{4(1),4(3),4(4)}{4(2),4(3),4(4)} *  * @author Dell * */public abstract class Test382 { public static int triangleCount(int[]S) {             int sum=0;    ArrayList<Integer> list=new ArrayList<>();ArrayList<ArrayList<Integer>> result=new ArrayList<>();backtracking(S,0,0,list,result);for(int i=0;i<result.size();i++){if(istriangle(result.get(i),S)){sum++;}}return sum; } public static boolean istriangle(ArrayList<Integer> list,int[] S) {       boolean flag=false; int a=S[list.get(0)]; int b=S[list.get(1)]; int c=S[list.get(2)]; if(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a&&a-b<c&&a-c<b&&b-c<a) { flag=true; }  return flag; }public static void backtracking(int[]a, int start, int k,ArrayList<Integer> list, ArrayList<ArrayList<Integer>> result){if(k==3)result.add(new ArrayList<>(list));else{for(int i=start;i<a.length;i++){list.add(i);backtracking(a,i+1,k+1,list,result);list.remove(list.size()-1);}}}public static int triangleCount1(int[]S){      int sum=0;for(int i=0;i<S.length;i++){for(int j=i+1;j<S.length;j++){for(int k=j+1;k<S.length;k++){if(S[i]>0&&S[j]>0&&S[k]>0&&S[i]+S[j]>S[k]&&S[i]+S[k]>S[j]&&S[j]+S[k]>S[i]&&S[i]-S[j]<S[k]&&S[j]-S[k]<S[i]&&S[i]-S[k]<S[j]){sum++;}}}}   return sum;}public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int[] a=new int[n];for(int i=0;i<a.length;i++){a[i]=sc.nextInt();}    //System.out.println(triangleCount(a));System.out.println(triangleCount1(a));}}