三角形算法

时间:2017-11-14 10:58:51

标签: algorithm

我有这个问题需要解决:

输入是数字和三角形,例如:

5
#-##----#
 -----#-
  ---#-
   -#-
    -

数字是三角形的行数。

我必须打印最大的“三角区” - 由-组成的最大三角形。对于这个答案是9。

三角形也可以倒置:

4
#-#-#--
 #---#
  ##-
   -

为此,输出为4。

我需要一些算法帮助。请给我一点帮助,而不是整个算法,因为我想尝试自己解决,我只需要一个方向。

3 个答案:

答案 0 :(得分:2)

<强>提示

我假设所有三角形都是以下形式:

--- 
 - 

并不喜欢:

 -    or  -    or    -
---       --        --
          -          -

注意2个单位的三角形由三个1单位三角形组成。 3个单位的三角形由3个重叠的2个单位三角形组成,依此类推。

下图是一个由三个2单位三角形组成的3单位三角形的例子,它们由三个1单位三角形组成

  - -+ -+* +* *            --- +++ ***
     -  +  *      ==>       -   +   *
        o                       o

剧透:完整算法跟随,不读它

 /!\ spoiler alert /!\

 /!\ spoiler alert /!\

 /!\ spoiler alert /!\

主要算法

你可以做第一遍来计算所有单位大小的三角形(里面只有1 -)。保持一个表格,其中T[x,y]是三角形的大小(边长)。在此过程中,您使用-初始化每个单元格。

然后你可以从上到下尝试构建更复杂的三角形。

当位于[x,y]位置时,你应该考虑下头的三角形:

  • [X-1,Y-1]
  • [x,y-1]
  • [X + 1,Y-1]

新三角形的大小将为1加上上述3个三角形中任何一个的最小尺寸。然后更新表T[x,y]

T[x,y+1] = 1 + min(T[x-1,y], T[x,y], T[x+1,y])

最后,只需找到表T中最大的三角形,然后计算相应的三角形区域。 (公式留给读者练习)

复杂性为O(n²)

答案 1 :(得分:0)

如果效率并不重要:

有一个搜索候选人的循环(它从左到右遍历每一行)。如果您发现-中断搜索并尝试计算此候选人

因此,首先向右移动检查它结束的位置(#)。然后你知道你的三角形的基数(指数)并直接知道它必须在下一行继续的位置,检查并重复直到你完全探索那个候选人。如果左方indix为行li的{​​{1}}和右ri,那么三角形必须在下一个row的{​​{1}}指数和row * row + 1处继续

存储其大小并再次继续搜索部分。一旦搜索访问了所有行终止

您可以通过忽略已经发现的三角形的li + 1来略微提高效率。但只有它们是三角形基行的一部分。

答案 2 :(得分:0)

我不是算法方面的专家,但是你只是要求一些帮助而不是答案,我相信我可以提交一个答案。

您需要找出一种测试空间的方法,以确定它是否在三角形内。一旦你有了,我会设计一个蛮力的方法(对每个空间运行“三角测试”)。

然后,当你有一个强力解决方案(这不是一个最佳方法)时,试着让它更有效率。 例如。在你有一个有效的解决方案之前,不要担心效率或聪明。 希望有所帮助。