怎樣數出有多少個三角形?

2021-07-04 08:56:49 字數 1596 閱讀 7936

最近在微博裡看到乙個題目,問這個圖形裡包含了多少個三角形,如圖所示。

首先給圖中每個線段的交點設乙個字母標記,如圖所示

然後窮舉出該三角形裡面所有的線段(一定要全),窮舉的結果如下:;

一共有36條線段。窮舉的技巧就是從長的 線段入手,比如ab,然後在這個線段裡面找子線段ad,db。這樣找會比較方便全面。

接下來我們要做的就是在上面這個集合中窮舉出每3條線段的組合,例如("ab",","ad","db"),然後判斷這三條線段能不能構成乙個三角形,如果可以構成三角形,例如(ab,bc,ac),我們就將結果加1,這樣窮舉完全部的組合後,就可以數出該三角形中包含了多少的子三角了。

當然,沒有人傻到真的要乙個乙個去數,告訴你 36條邊中任意3條邊的組合共有7140種!你要是自己乙個乙個地數,估計得到明天了。我們用程式解決這個問題。我寫了一段c**解決了這個問題,源**如下:

/*------------------ ********.c --------------------------*/

#include "stdio.h"

#define no_point '0'

char * map = ;

char *line = ;

int contains(char *str, char a)

i++;

} return 0;

}int isinaline(char a, char b, char c)

} return 0;

}char getcrosspoint(char * s1, char *s2)

if (*s1 == *(s2+1))

if (*(s1+1) == *s2)

if (*(s1+1) == *(s2+1))

return no_point;

}int is********(char * str1, char *str2, char * str3)

return 0;

}int get********count() }}

} return count;

}main()

**解讀:

函式get********count是計算這個圖形中共包含了多少個三角形,它的返回值即為結果。

函式is********是判斷三條線段是否能夠構成乙個三角形,如果可以構成乙個三角形則返回1,否則返回0.

函式getcrosspoint會被函式is********呼叫,它的作用是找出兩條線段str1和str2的交點字母。例如線段ab和線段ac的交點為a。如果兩條線段之間沒有交點,則返回 no_crossover ,如果是這樣,這三條邊一定不能構成三角形。

函式isinaline是來判斷三個點是否在1條直線上。例如點a,d,b是在一條直線上,雖然線段ad,ab,db兩兩有交點,但是它們在一條直線上,所以不構成三角形。

通過上面的程式可以得出結果:該圖形中共包含24個三角形。

這個方法貌似有點土,但是確實簡單易懂。你有更好的方法嗎?歡迎與我交流! 



求大三角形中三角形個數

一道筆試程式設計題要求求乙個大三角形中所有小三角形的個數,大約是下面這種情況 首先想到是的將問題由求邊長為n的三角形個數 求邊長為n 1的三角形個數 求邊長為1的三角形個數 1,回溯求得所有三角形個數。但是再仔細一看因為有重疊三角形和倒置的三角形,所以這個方法不可行。接著找到三角形個數由三部分組成 ...

經典演算法 (三)帕斯卡三角形(楊輝三角形)

楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在1654年發現這一規律的,比楊輝要遲393年,比賈憲遲600年。簡介 楊輝三角,是二項式係數在三角形中的一種幾何排列。在歐洲,這個表叫做帕斯卡三角形。帕斯卡 1623 1662 是在165...

三角形面積

算是自己第一道正式寫的演算法幾何吧,先從簡單的開始吧,加油!描述 給你三個點,表示乙個三角形的三個頂點,現你的任務是求出該三角形的面積 輸入 每行是一組測試資料,有6個整數x1,y1,x2,y2,x3,y3分別表示三個點的橫縱座標。座標值都在0到10000之間 輸入0 0 0 0 0 0表示輸入結束...