【程序解題】圖中有幾個三角形

在微信上看到一道題目,感覺蠻有意思,於是拿來練練編程,打算編寫一個可以解決此類找三角形數的通用程序:
具體的題目是:數出圖中共有多少個三角形:

大體思路是先給三角形的點(藍色)和線(紅色)編號:

再構建一個二維數組,以每點爲一維,元素是經過該點的線;

遍歷所有三點的組合,判斷能否組成三角形,判斷條件爲:三點兩兩共線且三點不共線。

具體代碼:

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;
	}
}



結果:

當需要解決別的三角形數問題時,按照規則構建相應的二維數組即可。

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