看了前面的主题,觉得很有趣,所以我打算练习编程,编写一个寻找这种三角形数的通用程序。
具体的主题是数出图上有几个三角形。
大体的想法是首先给三角形的点(蓝)和线(红)编号。
每个点构建一维的二维数组,要素是通过该点的线
调查所有三点的组合,判断三角形是否可以构成。 判断条件为三点双共线且三点不共线。
具体代码:
import java.util.Arrays; publicclasstriangularnum { privatestaticintnum=0; //构造二维阵列,每个点为一维,每个维度元素表示经过修改的线段; private int point [ ]={ 1,2,3,4 }、{ 1,5 }、{ 2,5 }、{ 3,5 }、{ 3,6 }、{ 2,6 }、{6}、{ 5、} publicstaticvoidmain (string [ ] args ) {new TriangularNum ().count ); (}private void count ) (/* )满足三点为一个三角形的条件(1、三点双共线) 2、三点不共线(//三点组合for(intI=0); i len - 2; I ) for(intj=I1; j len - 1; j ) for(intm=j1; m len; m () if ) twoline(I,j )!=(-1 ) twoline(I,m )!=(-1 ) twoline(m,j )!=(-1 ) threenotline(I,j,m ) ) {System.out.println ) )可以构成三角形的点是((i 1)、((i 1)、(j 1)、) ) ) ) ) m 1 ); num; }}}}System.out.println ('三角形的数量为' num ' );//判断两点是否为同一条直线。 同一直线输出线的标签、不同一直线输出-1publicinttwoline(intx,int y ) ) for ) intI=0; i point[x].length; I ) )/binarysearch(x (,y )方法使用二分法检查x数组是否包含y值,包括下标,返回值不包含小于零的值。 使用前对x数组进行排序的Arrays.sort(point(y ) ); 阵列.二进制搜索(if ) (point [ y ],point[x][i] ) {return point[x][i]; }}return -1; //判断三点是否为同一条直线。 true是非共线的publicbooleanthreenotline(intx,int y,int z ) {Arrays.sort ) point[y]}; arrays.binary search (point [ x ],twoLine(y ) y,z ) )0) {return true; }return false; }
结果:
需要解决其他三角形数问题时,根据规则构造合适的二维排列即可。