在学校我们遇到了一个非常难的问题,但学生们还没有人解决它。看看下面的图片:
http://d.imagehost.org/0422/mreza.gif
这是一种连接点的网络,它不会结束,每个点都有自己的代表它的数字。假设数字是这样的:1-23-456-78910-etc.等等。(你不能在图片上看到数字5或8,9 ......但它们在那里,它们的位置很明显,4和6中间的点是5,依此类推)。
1连接到2和3,2连接到1,3,5和4等。
数字1-2-3表示它们代表图片上的三角形,但数字1-4-6没有,因为4与6没有直接连接。
让我们看看2-3-4-5,这是一个平行四边形(你知道为什么),但是4-6-7-9不是平行四边形,因为在这个问题中有一条规则说所有方面都必须是等于所有数字 - 三角形和平行四边形。
还有六边形,例如。 4-5-7-9-13-12是六边形 - 这里的所有边也必须相等。
12345 - 这不代表任何东西,所以我们忽略它。
我想我很好地解释了这个问题。通过使用如上所述的数字输入来确定是否是三角形/平行四边形/六边形(根据所描述的规则)给出的实际问题。
例如:
1 2 3 - triangle
11 13 24 26 -parallelogram
1 2 3 4 5 - nothing
11 23 13 25 - nothing
3 2 5 - triangle
我正在阅读计算几何以解决这个问题,但我很快放弃了,似乎没有任何帮助。一位朋友告诉我这个网站,所以我决定尝试一下。
如果您对如何解决此问题有任何想法,请回复,您可以使用伪代码或c ++。非常感谢你。
答案 0 :(得分:1)
让我们点这样的点:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
您可以将其存储在矩阵中。现在让我row[i] = the row number i is on
和col[i] = the column number i is on
。对于每个i
,可以或多或少地计算这些。
首先,提升您的给定数字。你需要一个三角形正好3个点,平行四边形需要4个点,六角形需要6个点 - 其他任何东西你可以将其视为无数字。
请注意,根据您的规则,我们只能在此矩阵中使用直角三角形。标记三个点A
,B
,C
。您可以检查这些是否形成三角形,方法是从row[A]
到row[B]
,然后从col[B]
到col[C]
,然后从row[C]
到row[A]
对角线并检查距离是否相同以及是否到达正确的位置。您可以提前终止此操作,例如,如果B
为8且A
为1,那么一旦您在第1列上点击11,就可以告诉您无法找到它。
对于平行四边形,可以进行类似的推理。标记4个点A
,B
,C
,D
并记住按升序排序(请记住,此处的点数实际上是数字)。看看您是否可以从同一行的col[A]
到col[B]
,然后从同一行的col[C]
到col[D]
,然后从{{1}对角或垂直向下从row[A]
到row[C]
再到row[B]
然后(在前一个对角线的方向相同!)。
六边形也有必须测试的特定格式。以下是六边形在这种表示中的样子:
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
1
2 3
4 5 6
7 8 9 10
11 12 13 14 15
16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 32 33 34 35 36
你可以注意到,每两对点共用同一列,两个中间点之间的水平距离是任意两点之间垂直距离的两倍,也是任何其他两点之间水平距离的两倍。
您还需要考虑轮换,因此您需要针对每种情况进行更多测试。
除非您计划有效地计算它们,否则您甚至不需要row[D]
和row
数组。只需遍历矩阵,直到您按照排序顺序识别第一个点,并尝试在遵循每个规则的同时找到其他点。
这不是一个很好的方法,但是你只需要一个256x256的矩阵,所以虽然这会产生相当多的代码,但它非常有效。我希望我能说清楚,如果没有,请说出不清楚的地方。无论如何,也许其他人会发布一个更好的解决方案,所以如果可以的话,再等一会儿......