我有这个问题需要解决:
输入是数字和三角形,例如:
5
#-##----#
-----#-
---#-
-#-
-
数字是三角形的行数。
我必须打印最大的“三角区” - 由-
组成的最大三角形。对于这个答案是9。
三角形也可以倒置:
4
#-#-#--
#---#
##-
-
为此,输出为4。
我需要一些算法帮助。请给我一点帮助,而不是整个算法,因为我想尝试自己解决,我只需要一个方向。
答案 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]位置时,你应该考虑下头的三角形:
新三角形的大小将为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)
我不是算法方面的专家,但是你只是要求一些帮助而不是答案,我相信我可以提交一个答案。
您需要找出一种测试空间的方法,以确定它是否在三角形内。一旦你有了,我会设计一个蛮力的方法(对每个空间运行“三角测试”)。
然后,当你有一个强力解决方案(这不是一个最佳方法)时,试着让它更有效率。 例如。在你有一个有效的解决方案之前,不要担心效率或聪明。 希望有所帮助。