当前位置:   article > 正文

凸多边形最优三角剖分(动态规划)_凸多边形最优三角剖分动态规划

凸多边形最优三角剖分动态规划

【问题描述】使用动态规划算法解凸多边形最优三角剖分问题,具体来说就是,依据递归式,按照顺序求得子问题,使得该三角剖分中诸三角形上权之和为最小。

【输入形式】在屏幕上输入凸多边形顶点个数和顶点坐标。按逆时针顺序输入顶点坐标。

【输出形式】最优三角剖分后的三角形顶点。

【样例输入】

 7

 8 26

 0 20

 0 10

 10 0

 22 12

 27 21

 15 26

【样例输出】

 012

 234

 024

 456

 046

【样例说明】

 输入:顶点个数为7,每一行为一个顶点坐标,以空格分隔。如下图所示,第二行至第八行分别为顶点v0~v6的坐标。

 输出:每一行为顺序产生的最优三角剖分后的三角形顶点。

 

【评分标准】根据输入得到准确的输出。

  1. import numpy as np
  2. import math
  3. def res(i,j,s):
  4. if i == j:
  5. return
  6. res(i,int(s[i][j]),s)
  7. res(int(s[i][j]+1),j,s)
  8. print(str(i-1)+str(s[i][j])+str(j))
  9. def min_weight_triangulation(w,t,s,n):
  10. for i in range(1,n):
  11. t[i,i] = 0
  12. s[i,i] = 0
  13. for len in range(2,n):
  14. for i in range(1,n-len+1) :
  15. j = i+len-1
  16. t[i,j] = t[i+1,j] + w[i-1,i] + w[i,j] + w[j,i-1]
  17. s[i,j]= i
  18. for k in range(i+1,j) :
  19. q = t[i,k] + t[k+1,j] + w[i-1,k] + w[k,j] + w[j,i-1]
  20. if q < t[i,j]:
  21. t[i,j] = q
  22. s[i,j] = k
  23. def main():
  24. n = int(input())
  25. a = []
  26. for k in range(n) :
  27. a.append(list(map(int,input().split())))
  28. w = np.zeros((n,n),dtype = np.int8)
  29. for i in range(n) :
  30. w[i][i] = 0
  31. for i in range(n):
  32. for j in range(i+1,n):
  33. x = a[i][0] - a[j][0]
  34. y = a[i][1] - a[j][1]
  35. w[i][j] = w[j][i] = math.sqrt((x**2)+(y**2))
  36. t = np.zeros((n,n),dtype = np.double)
  37. s = np.zeros((n,n),dtype = np.int8)
  38. min_weight_triangulation(w,t,s,n)
  39. res(1,n-1,s)
  40. if __name__ == '__main__':
  41. main()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/670574
推荐阅读
相关标签
  

闽ICP备14008679号