BIO对此实施挑战有哪些方法?

时间:2015-12-07 21:52:28

标签: computational-geometry

我正在通过解决尽可能多的编程问题为英国信息学奥林匹克运动会做准备,而且我偶然发现了一个似乎在我之上的问题。这是2014年第1轮论文。转到Question 2

我正在努力寻找将其纳入代码的方法。我的第一个想法是简单地使用蛮力 - 即突出瓦片可以合法匹配的不同方式,但这似乎效率低,它是一个3小时的论文,我必须解决其他两个问题,而且我可能会错过一些组合

一般情况下,除了实施问题之外,这个问题属于哪个其他类别?我应该阅读哪些有用的提示和内容,以便在将来解决类似的问题?我真的感觉不到我的深度,因为我从来没有解决过这样的问题。

2 个答案:

答案 0 :(得分:0)

我无法对这可以解决的问题给出一般性暗示,但以下是如何解决这个问题的建议。

我只会对红色球员的得分(实线)进行描述,因为绿色球员的得分可以类似地进行。这种方式可能不是最优雅的,但是对于3小时的时间限制,任何有效的方法都是正确的。我只会覆盖25号标记部分(2a)。

6种瓦片类型中的每一种都可以被描述为集合{北,西,南,东}中的不同类型的线路出口,比如说,{n,w,s,e}。每种瓷砖类型都由其中两个插座准确描述。

Tile 1: {n, s}
Tile 2: {e, w}
... and so on

对于任何给定的图块,计算可能的循环的方法是跟踪出口并查看它们是否返回到给定的图块。这可以通过从左上方的区块开始来完成:

  1. 选择图块T(最初左上角)。跟随两个出口中的任何一个到下一个瓷砖。如果你撞墙,中止并从待检查的剩余瓷砖中移除瓷砖T,然后选择下一个瓷砖,然后重复。
  2. 对于下一个图块,请检查上一个图块的出口是否为任何出口的匹配对(“T' s' s' s new-tile”等)当前的瓷砖。如果没有,则从待检查的剩余切片中止并移除切片T,然后选择下一个切片,然后重复。
  3. 如果我们尚未中止,我们找到了匹配的插座。跟随新瓷砖的剩余出口并从1开始重复: 3A。我们设法返回到起始区块T并将T的剩余出口与最后一个区块匹配 - >计算循环的长度。 3A。我们在此之前中止,或者返回到T牌但是不能与最后一个出口匹配。
  4. 在T被覆盖(计数或丢弃)之后,重复下一个瓷砖并重复该过程,但是将已经覆盖的瓷砖作为墙壁处理。重复,直到处理完所有瓷砖。
  5. 重复绿色播放器(虚线)。祝奥运会好运!

答案 1 :(得分:0)

对于2(a):

初始化NxN计数器网格,每个计数器设置为2.为方便起见,您可以扩展到(N + 2)x(N + 2)网格,其中标记轮廓具有空计数器。

扫描网格以搜索非零计数器。

当你找到一个时,开始一个循环跟踪过程:减少这个单元格的计数器并选择一个非零计数器的邻居(它没有,跳过这个单元格)。然后移动到确保路径连续性的单元格(知道单元格代码,确定入口侧的出口侧)。过了一会儿,你会遇到初始单元格(你发现了一个循环)或零计数器(你发现了一个开放的路径)。

如果所有进入/退出链接颜色相同,则累计此颜色的循环单元格数。

您将重复两次完整网格扫描。最后,所有计数器都为零。

您将需要一个“大”决策表,对于任何类型的磁贴,在四个基本方向之一中具有邻居并且邻居具有给定类型,下一个方向是什么(6x4x6) = 144个条目)。