1. 项目背景与需求分析
"数三角形"这个题目听起来简单,但实际蕴含着丰富的数学思维训练价值。作为GESP(青少年编程能力等级考试)二级的典型题型,它考察的是考生对基础算法和几何图形分析的能力。这类题目通常会给出一组由线段组成的图形,要求编程计算出其中包含的所有三角形数量。
在实际教学中,我发现很多初学者容易陷入"肉眼数数"的误区,而忽略了系统化的解题思路。这道题的核心价值在于培养以下能力:
- 图形结构的抽象化理解
- 组合数学的实际应用
- 算法思维的建立
- 边界条件的全面考虑
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路与算法设计
2.1 图形建模方法
首先需要将视觉图形转化为可计算的数据结构。常见的方法有:
- 邻接矩阵表示法:用二维数组记录点与点之间的连接关系
- 边列表表示法:直接存储所有边的两个端点信息
- 邻接表表示法:为每个顶点维护一个相连顶点的列表
对于初学者,我推荐使用邻接矩阵,因为它最直观且易于实现。例如一个包含4个点的完全图可以表示为:
python复制adj_matrix = [
[0, 1, 1, 1], # 点0连接点1、2、3
[1, 0, 1, 1], # 点1连接点0、2、3
[1, 1, 0, 1], # 点2连接点0、1、3
[1, 1, 1, 0] # 点3连接点0、1、2
]
2.2 三角形判定条件
三个点能构成三角形当且仅当:
- 三点不共线
- 每两点之间都有边相连
用代码表示就是:
python复制if adj_matrix[i][j] and adj_matrix[j][k] and adj_matrix[k][i]:
# 找到三角形i-j-k
2.3 完整算法流程
- 遍历所有可能的三点组合(i,j,k),其中i<j<k避免重复计数
- 检查三点是否两两相连
- 满足条件则计数器加1
- 最终输出总数
时间复杂度分析:对于n个点,组合数为C(n,3)=n(n-1)(n-2)/6,因此是O(n³)复杂度。对于GESP二级的题目规模(通常n≤20),这个复杂度完全可接受。
3. 代码实现与优化技巧
3.1 基础实现版本
python复制def c
