算法设计 凸多边形的三角剖分
1. 问题描述
设P是一个有n个顶点的凸多边形,P中的弦是P中连接两个非相邻顶点的线段。用P中的n-3条弦将P剖分成n-2个三角形(如下图所示)。使得n-3弦的长度之和最小的三角剖分称为最优三角剖分。
2. 具体要求
输入:输入的第一行是一个正整数m,表示测试例个数,接下来几行是m个测试例的数据,每个测试例的数据由两行组成,第一行含一个正整数n (n<=500),表示凸多边形的顶点个数;第二行含2n个实数x1 , y1 , x2 , y2 , …xn , yn ,按顺时针方向依次给出n个顶点的坐标值(xi, yi) i=1, 2, …, n,整数之间用一个空格隔开。
输出:对于每个测试例输出一行,含一个实数(精确到小数点后三位),表示最优三角剖分的n-3条弦的长度之和。两个测试例的输出数据之间用一个空行隔开。
3. 测试数据
输入:
1
6
1 2 2 1.5 2 0.5 1 0 0 0.5 0 1.5
输出:
5.606
代码:
/// <summary>
/// 计算每个点之间的距离
/// </summary>
/// <param name="arr">数据数组</param>
/// <param name="n">数组尺寸</param>
/// <param name="len">用于存放结果的数组</param>
void calcLen(double** arr, int n, double** len)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
len[i][j] = sqrt(pow(arr[i][0] - arr[j][0], 2) + pow(arr[i][1] - arr[j][1], 2));
}
}
}
/// <summary>
/// 获取i、j、k三点组成的三角形的周长
/// </summary>
/// <param name="i">i点</param>
/// <param name="j">j点</param>
/// <param name="k">k点</param>
/// <param name="len">存放各点距离的数组</param>
/// <returns>i、j、k三点组成的三角形的周长</returns>
double

本文探讨了如何找到凸多边形的最优三角剖分,即使用n-3条弦将多边形分割成n-2个三角形,使弦的长度之和最小。算法设计涉及几何学和动态规划,适用于顶点数不超过500的凸多边形。给定测试案例,程序需输出最优弦长之和。
最低0.47元/天 解锁文章
2258

被折叠的 条评论
为什么被折叠?



