寻求跳跃者


19

我最近有一个非常奇怪的不规则棋盘。它的正方形到处都是,甚至没有全部相连。至少它们仍然布置在常规网格上。我希望适应国际象棋规则,以便能够在棋盘上玩游戏,但首先,我需要一块可以在棋盘上任何地方玩的棋子,这似乎是我最好的选择。

跳跃者是骑士的国际象棋概括。跃点由两个整数mn设置参数,可以在一个方向上移动m个正方形,然后在任一垂直方向上移动另一个n个正方形。对于标准骑士,我们有(m,n)=(2,1)。整个动作被认为是一次跳跃,因此到目标途中的正方形都不需要为空,甚至不存在。

挑战

您会以正2D整数坐标列表的形式获得“棋盘”,该2D整数坐标表示作为棋盘一部分的正方形。您的任务是找到一个跳线,如果有足够的动作,该跳线可以到达板上的任何正方形。

让我们看一些例子。标准棋盘使用8x8正方形的规则网格(请注意,对于此挑战,我们不区分白色和黑色正方形):

########
########
########
########
########
########
########
########

标准骑士可以达到所有目标,因此(2, 1)是有效的输出。但是,(1, 1)例如,这将是无效的,因为无论从哪里开始,这样的一块都只能达到正方形的一半。(1, 0)另一方面,由于所有正方形都是正交连接的,因此这也是有效的输出。

现在,如果我们有一个不规则的董事会,例如:

#   #
 # # #
  # # #
 # #
    #

然后可能的解决方案是(1, 1)(3, 1)。我们还可以拥有一个完全断开区域的板,例如:

#### ####
#### ####
#### ####
#### ####

标准的骑士(2, 1)仍然可以到达这里的所有方块,这实际上是唯一的解决方案。

最后,任何跳伞者都无法完全达到以下简单的要求:

#
 ##

请注意,输入格式将不是ASCII表示,而是坐标列表。例如,上面的第二个示例可以给出为:

[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]]

规则

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方案),函数返回值或函数(out)参数输出结果。

输入坐标可以采用任何方便的列表格式(平面列表,对列表,复杂整数列表,具有一致分隔符的字符串等)。

输出应为两个整数mn,用于标识跳线(如果存在解决方案的话)(作为两个单独的整数,一个列表,带有非数字定界符的字符串等)。如果不存在解决方案,则可以输出任何不可能是有效跳线的一致值。这包括(0, 0)正常格式的整数对,以及不是非负整数对的任何东西。

您的程序需要在一分钟内处理任何测试用例。这是一个模糊的限制,但是使用常识:如果在您的计算机上花费2分钟,我认为我们可以假设它可能在其他人的计算机上运行1分钟,但是如果花费20分钟,则可能性较小。在几秒钟之内解决每个测试用例就不难了,因此,该规则仅用于排除幼稚的蛮力。

适用标准规则。

测试用例

每个测试用例的形式都是board => all valid leapers。请记住,您只需要输出其中之一即可。如果跳线列表为空,请确保返回的内容不是有效的跳线。

Examples above:
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [1, 8], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [2, 8], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [3, 8], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [4, 8], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [5, 8], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [6, 8], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7], [7, 8], [8, 1], [8, 2], [8, 3], [8, 4], [8, 5], [8, 6], [8, 7], [8, 8]] => [[0, 1], [1, 2], [1, 4], [2, 3], [3, 4]]
[[1, 1], [5, 1], [2, 2], [4, 2], [6, 2], [3, 3], [5, 3], [7, 3], [2, 4], [4, 4], [5, 5]] => [[1, 1], [1, 3]]
[[1, 1], [2, 2], [3, 2]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => [[1, 2]]

Square boards:
[[1, 1], [1, 2], [2, 1], [2, 2]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [2, 1], [2, 2], [2, 3], [3, 1], [3, 2], [3, 3]] => [[0, 1]]
[[1, 1], [1, 2], [1, 3], [1, 4], [2, 1], [2, 2], [2, 3], [2, 4], [3, 1], [3, 2], [3, 3], [3, 4], [4, 1], [4, 2], [4, 3], [4, 4]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5]] => [[0, 1], [1, 2]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [2, 3]]
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 1], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [4, 7], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [5, 7], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6], [6, 7], [7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]] => [[0, 1], [1, 2], [2, 3]]

Miscellaneous:
[[1, 1], [2, 1]] => [[0, 1]]
[[1, 1], [1, 2]] => [[0, 1]]
[[1, 1], [12, 35]] => [[11, 34]]
[[1, 1], [1, 2], [2, 1], [2, 2], [6, 1], [6, 2], [6, 3], [6, 4], [7, 1], [7, 2], [7, 3], [7, 4], [8, 1], [8, 2], [8, 3], [8, 4], [9, 1], [9, 2], [9, 3], [9, 4]] => []
[[1, 1], [1, 2], [1, 3], [1, 4], [1, 5], [1, 6], [2, 1], [2, 2], [2, 3], [2, 4], [2, 5], [2, 6], [3, 1], [3, 2], [3, 5], [3, 6], [4, 1], [4, 2], [4, 5], [4, 6], [5, 1], [5, 2], [5, 3], [5, 4], [5, 5], [5, 6], [6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6]] => [[0, 1], [1, 2], [1, 4]]
[[2, 2], [2, 4], [2, 6], [2, 8], [4, 2], [4, 4], [4, 6], [4, 8], [6, 2], [6, 4], [6, 6], [6, 8], [8, 2], [8, 4], [8, 6], [8, 8]] => [[0, 2], [2, 4]]

Random boards:
[[1, 5], [1, 9], [2, 6], [2, 8], [2, 10], [2, 12], [3, 5], [3, 7], [3, 9], [3, 11], [3, 13], [4, 2], [4, 4], [4, 6], [4, 8], [4, 14], [5, 1], [5, 3], [5, 5], [5, 7], [6, 2], [6, 4], [7, 1], [8, 2]] => [[1, 1], [1, 3]]
[[1, 3], [1, 4], [1, 5], [1, 6], [1, 7], [2, 1], [2, 2], [2, 3], [2, 4], [2, 7], [3, 1], [3, 2], [3, 3], [3, 4], [3, 6], [3, 7], [4, 2], [4, 3], [4, 4], [4, 5], [4, 6], [5, 3], [5, 4], [5, 6]] => [[0, 1], [1, 2]]
[[1, 8], [2, 6], [2, 10], [3, 3], [3, 4], [3, 8], [4, 1], [4, 11], [5, 3], [5, 9], [6, 12], [8, 11], [10, 10], [11, 12], [12, 6], [12, 8], [13, 6], [13, 8], [13, 10], [13, 11], [14, 5], [14, 7], [14, 8], [14, 13], [14, 14], [15, 7], [15, 9], [15, 11], [15, 12], [16, 6], [16, 7], [16, 9], [16, 13], [16, 14], [17, 10], [17, 12], [18, 8], [18, 12], [20, 9], [21, 11], [22, 13], [23, 10], [23, 11], [23, 15], [24, 12]] => [[1, 2]]
[[1, 17], [1, 21], [3, 11], [3, 15], [3, 19], [3, 23], [5, 13], [5, 21], [7, 11], [7, 15], [7, 19], [9, 1], [9, 13], [9, 17], [11, 3], [11, 7], [11, 15], [11, 19], [13, 5], [13, 9], [13, 13], [13, 17], [13, 21], [15, 11], [15, 15], [15, 19], [17, 13], [17, 17]] => [[2, 2], [2, 6], [2, 10]]
[[1, 3], [2, 4], [2, 5], [3, 6], [4, 1], [5, 3], [5, 6], [5, 7], [6, 12], [6, 14], [6, 21], [7, 9], [7, 19], [8, 9], [8, 15], [8, 17], [8, 18], [8, 24], [9, 12], [9, 19], [10, 12], [10, 14], [10, 17], [10, 21], [11, 22], [12, 15], [12, 17], [12, 24], [13, 16], [14, 20], [14, 21], [14, 26], [15, 13], [15, 19], [16, 18], [16, 23], [17, 16], [17, 24]] => [[2, 3]]
[[1, 11], [3, 13], [4, 10], [6, 14], [8, 12], [9, 9], [9, 15], [12, 8], [13, 5], [13, 19], [13, 21], [14, 8], [15, 1], [15, 17], [16, 4], [16, 14], [16, 18], [16, 20], [17, 21], [18, 2], [18, 16], [18, 18], [19, 9], [19, 13], [19, 15], [20, 12], [21, 1], [21, 17], [22, 4], [22, 10], [23, 7]] => [[1, 3]]
[[1, 39], [6, 37], [8, 32], [10, 27], [11, 31], [11, 35], [12, 22], [16, 21], [16, 29], [16, 33], [18, 34], [21, 3], [21, 9], [21, 19], [23, 8], [23, 14], [23, 22], [23, 24], [23, 36], [24, 6], [25, 13], [25, 17], [26, 1], [26, 11], [28, 6], [28, 20], [28, 26], [28, 30], [28, 34], [30, 11], [30, 15], [30, 21], [32, 6], [33, 28], [33, 32], [35, 13], [35, 23]] => [[2, 5]]

作为一种特殊情况,请注意,对于仅由一个单元组成的电路板,任何跳线均有效,但是您的输出必须与实际跳线相对应,因此[0, 0]无效输出。


快速提问。骑士(2,1)怎么样?如果我错了,请纠正我,但我很确定骑士可以在任何一个方向上移动3个正方形,然后在垂直于前一个方向的任何方向上移动1个正方形,因此应该是(3,1)
R. Kap

1
@ R.Kap你错了。;)en.wikipedia.org/wiki/Knight_
chess

@DLosc好的,哇。我想我是。感谢那!
R. Kap

我们可以在列表中输出所有有效的跳线吗?如果这样做,是否可以输出类似的跳线[[1, 0], [0, 1]]
FryAmTheEggman '16

@FryAmTheEggman请(仅)其中一个。
Martin Ender

Answers:


12

Pyth, 41 35

hfqQu@+G+VM*s_BM*F_BMTGQ]hQ)maVhQdt

如果没有有效的跳线,则错误退出,如果忽略STDERR,则给出空字符串。

在这里尝试或运行测试套件

感谢isaacg,节省了6个字节!基本上,只需选择从第一个图块到另一个图块的每个有效跳线,即可找到所有跳线候选者。然后,对于每一个,它都将构成[x, y]跳线可以采用的所有八种偏移配置。然后,它找到从移动之后的第一个图块开始的所有移动,并丢弃那些不在输入中的移动。它会一直这样做,直到结果保持不变。如果此最终列表与输入相同,则跳线有效。

当我测试时,标准棋盘花费的时间最长,而在我并不十分出色的计算机上花费了大约3秒钟。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.