【程序解题】图中有几个三角形

在微信上看到一道题目,感觉蛮有意思,于是拿来练练编程,打算编写一个可以解决此类找三角形数的通用程序:
具体的题目是:数出图中共有多少个三角形:

大体思路是先给三角形的点(蓝色)和线(红色)编号:

再构建一个二维数组,以每点为一维,元素是经过该点的线;

遍历所有三点的组合,判断能否组成三角形,判断条件为:三点两两共线且三点不共线。

具体代码:

import java.util.Arrays;
public class TriangularNum {
	private static int num = 0;
	//构造二维数组,每一点为一维,每维元素表示经过改点的线段;
	private int point[][] = { 
			{ 1, 2, 3, 4 }, 
			{ 1, 5 }, 
			{ 2, 5 }, 
			{ 3, 5 }, 
			{ 4, 5, 6 }, 
			{ 3, 6 }, 
			{ 2, 6 },
			{ 1, 6, 7 }, 
			{ 2, 7 }, 
			{ 3, 7 }, 
			{ 4, 7 } };
	//点数
	private final int len = point.length;
	
	public static void main(String[] args) {
		new TriangularNum().count();
	}

	private void count() {
		/*
		 * 满足三点成一个三角形的条件:
		 *  1、三点两两共线 
		 *  2、三点不共线
		 */
		//三点组合
		for (int i = 0; i < len - 2; i++) {
			for (int j = i+1; j < len - 1; j++) {
				for (int m = j+1; 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) + "," + (j+1) + "," + (m+1));
						num++;
					}
				}
			}
		}
		System.out.println("三角形数为:"+num);
	}

	// 判断两点是否共线,共线输出线的标号,不共线输出-1
	public int twoLine(int x, int y) {
		for (int i = 0; i < point[x].length; i++) {

                        //binarySearch(x[],y)方法使用二分法查找x数组中是否包含y值,包含返回下标,不包含返回值小于零,使用前要对x数组进行排序

                        Arrays.sort(point[y]);
			if ( Arrays.binarySearch(point[y], point[x][i]) >= 0) {
				return point[x][i];
			}
		}
		return -1;
	}

	// 判断三点是否共线,true为不共线
	public boolean threeNotLine(int x, int y, int z) {

                        Arrays.sort(point[y]);

                       if (Arrays.binarySearch(point[x], twoLine(y, z)) < 0) {
			return true;
		}
		return false;
	}
}



结果:

当需要解决别的三角形数问题时,按照规则构建相应的二维数组即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章