找到用三角形制成的六边形的最大外侧和

时间:2013-07-01 18:24:49

标签: c++ algorithm

我遇到三角形的问题。

我有6个三角形,例如: Image

每个三角形的每边都有一个值。问题是我可以移动三角形,我可以旋转它们。我必须像这样创建一个六边形:

Image

我必须添加三角形的外侧并获得最高分。在这个例子中是152。

内侧必须相等 例如3,3,2,2和5,5,7,7其中4 4和1 1。

我在C ++中这样做。

我将每个三角形保存在一个数组中。

int triangle[6][3];
for(int i=0;i<6;i++)
    cin>>triangle[i][0]>>triangle[i][1]>>triangle[i][2];        

我打算将数组的最后一个元素与其他元素进行比较,但它不起作用。

谁能给我一个想法来解决这个问题?因为我不知道如何为三角形生成所有可能的组合以创建六边形,以及在其他时间不在同一数组中搜索的方法,以及如何添加以获得分数。

可能存在无法形成六边形的情况。

最后一个元素可能是我不能形成三角形,然后我需要旋转三角形来形成六边形。

2 个答案:

答案 0 :(得分:1)

我会发展这种逻辑。你编写代码。

  1. 我们的目标是获得最大金额 =&gt;我们希望外部最高值 三角形的不是自由的边,即那些内部的边应该理想地取最小值
  2. 搜索三角形数组内三角形边的最小值
  3. 是否有任何其他三角形也有此值的一面
  4. 如果不是,请继续下一个最小值(这可能属于完全不同的三角形的一侧),然后返回到第3步
  5. 假设有n个这样的三角形
  6. 考虑其中一个人说(n - i)一个(其中我是你回到第6步的次数)... 这两个三角形现在沿着匹配方融合
  7. 这些三角形中的每一个现在都有 2个自由边
  8. 与其他三角形比较以查看它们是否具有匹配的边
  9. 有些三角形必须匹配。 在六边形中,每个三角形只有一个自由边。如果找到任何一个三角形的不匹配,则表示无法形成六边形。 /强>
  10. 如果找到了匹配项,请考虑(n - j)一个(其中j是你回到第10步的次数)...继续 //
  11. 在结束时,第6个三角形与剩下间隙的2个三角形的两边不匹配,请返回更高的步骤
  12. 如果该步骤失败,请转到步骤.. //....
  13. 如果失败则转到步骤10.
  14. 如果失败则转到第6步

答案 1 :(得分:1)

这是一个算法:

选择一个三角形。称之为 A 。 (在本例中,1-4-20三角形。)

迭代 A 的两侧;选择一侧(例如1)并假设它将是外侧。下一侧(4)必须是内侧,因此找到可以匹配该侧的所有其他三角形(在这种情况下只有一个,4-7-50)。迭代这个列表,寻找下一个内侧的匹配(50)。继续,直到找到所有可能的六边形,以选择 A 的一面。

一旦您遍历 A 的所有方面并找到所有可能的六边形,请选择得分最高的那个。

难道有一部分难吗?您需要有关数据结构的帮助吗?

修改

我建议学习更好的数组容器,但这可能是另一天。

该函数应该将两个数组作为参数,并返回一个。 (也许有一些数字表示数组的长度。)两个参数是1)部分六边形,2)其余的三角形。返回值是可以从那些中制作的最佳六边形;它可能是空的。

假设我们用

调用该函数
{(3,1,5)}, {(1,4,20), (50,2,3), (5,2,7), (7,5,20), (4,7,50)}

该函数查找5的匹配项,并找到两个可能的匹配项:(5,2,7)和(5,20,7)。所以它进行两次递归调用,

{(3,1,5), (5,2,7)}, {(1,4,20), (50,2,3), (7,5,20), (4,7,50)}

{(3,1,5), (5,20,7)}, {(1,4,20), (50,2,3), (5,2,7), (4,7,50)}

它从这些调用中接收两个六边形(最多),比较它们,然后返回更好的六边形。