一组多米诺骨牌由两个数字组成,使得从0到N的每一个整数组合都被表示出来。为了方便起见,下面的示例引用了N=6,但是N=9和N=12也很常见。瓷砖的方向并不重要(它们通常是用点而不是数字打印的),所以[1-6]
和[6-1]
指的是同一个瓷砖,其中一组中只有一个。
大多数玩多米诺骨牌的游戏都是让玩家轮流把多米诺骨牌添加到已经在桌子上玩过的多米诺骨牌,这样新多米诺骨牌上的数字之一就被放置在桌子一端的同一数字旁边。因此,您可以向现有的[2-5]
行的任何一端添加一个[2-3][3-3][3-5]
,从而生成[5-2][2-3][3-3][3-5]
或[2-3][3-3][3-5][5-2]
。
许多这样的游戏要求“双打”--上面有两个相同数字的多米诺骨牌--与其他骨牌垂直放置。除了我们在这里不关心的得分,这没有任何影响,除非.
许多这样的游戏,然后允许“线”在一些或所有的双打分叉。5向上是这样一个游戏,在每双线可以分叉成3个新的线,所以所有的四个方面的双重可能有一个匹配的多米诺骨牌。
这里有一个多米诺骨牌的布局示例,它是在一个5向上的游戏中设置的"double 6“(其中A\\B或a是一个多米诺骨牌):
4
-
0
3|0 0|0 0|2
0
-
1
4|1 1|1 1|6
3
1 -
- 6
5
6
6|5 5|5 5|0 0|6 - 6|2 2|1
6
5
- 6
4 -
4
您的任务是按照将多米诺骨牌添加到表中的顺序,获取多米诺骨牌的列表,并确定此顺序是否代表五人的法律游戏。
您可以编写一个从stdin获取输入的完整程序,也可以编写一个将输入作为一个或多个参数的函数。
规范输入是一个由两个整数元组组成的列表或数组。列表、数组数组、元组向量等都是接受输入的有效形式,就像表示上述任何一个或多个字符串的字符串一样。输入将只包含一对非负整数,有效多米诺。
对于有效的和无效的游戏,输出应该是一个真实值或假值。
您的代码应该在语言的最大整数值的能力范围内接受任意大的多米诺数字。
示例:
0-6
是有效的,其他任何一种多米诺骨牌都是有效的。0-6 6-0
无效,一组中只有一个0-6
多米诺。6-6 6-5 5-3 3-0
是有效的,一个简单的线性排列。6-6 6-5 3-0 5-3
无效,在播放5-3
之前,第三个多米诺骨牌没有要连接的3
或0
。1-1 1-2 1-3 1-4 1-5 1-6
无效,所有四个打开的1
端都用完了,因此没有地方连接1-6
。1-1 1-2 1-3 1-4 1-5 3-6 1-6
有效,3-6连接到1-3,然后1-6可以连接到3-6。5-5 5-4 5-0 0-6 6-6 6-4 6-2 2-1 6-3 5-1 1-1 1-6 4-1 1-0 0-0 2-0 3-0 0-4
是有效的,上面举例说明了12-12 12-1 3-12 3-1 1-2 3-3
是有效的,使用较大的多米诺骨牌,并且位置不明确。注意:这里所要求的函数不是有效的五向上游戏的完美检查。我们在这里忽略了关于哪个多米诺骨牌先玩的规则,这将需要更多关于游戏变体和玩家数量的信息,并将取消相当一部分输入的资格。
发布于 2018-01-03 00:59:40
function(L,x=c(),y=c()){o=T
z=length
if(z(L)){p=sort(L[1:2])
w=rep(p,2-(p[2]>p[1]))
x=rbind(p,x)
if(z(y)){m=match(p,y,0)
v=which.max(m)
if(m[v]>0){y=y[-m[v]]
w=w[-v]}}
y=c(y,w)
L=L[-1:-2]
o=o&f(L,x,y)&!sum(duplicated(x))}
o}
代码以有序列表的形式接收片段,并根据规范返回TRUE或FALSE。该函数递归地扫描每一段,将其添加到索引中以验证是否没有重复项,并跟踪可用的插入点,以检查是否可以有效地将该片段添加到堆栈中。件连接的处理(例如,通过1或2连接1-2 )是以贪婪的方式完成的,所以有些奇怪的配置可能会爆炸,这并不是完全不可能的。
https://codegolf.stackexchange.com/questions/151908
复制相似问题