在微信上看到一道題目,感覺蠻有意思,於是拿來練練編程,打算編寫一個可以解決此類找三角形數的通用程序:
具體的題目是:數出圖中共有多少個三角形:
大體思路是先給三角形的點(藍色)和線(紅色)編號:
再構建一個二維數組,以每點爲一維,元素是經過該點的線;
遍歷所有三點的組合,判斷能否組成三角形,判斷條件爲:三點兩兩共線且三點不共線。
具體代碼:
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;
}
}
結果:
當需要解決別的三角形數問題時,按照規則構建相應的二維數組即可。