轨道
/
Go
Go
/
练习
/
多米诺骨牌
多米诺骨牌

多米诺骨牌

困难

简介

在 Toyland,火车总是忙着把各种宝物送往城市的各个角落,从闪亮的弹珠到稀有的积木。 它们行驶的轨道由彩色的多米诺骨牌形状的部件拼成,每块上面都标着两个数字。 要让火车跑起来,这些骨牌必须首尾相接,连成一条数字完全匹配的完整链条。

今天,一批稀有玩具的紧急运送暂时搁置了。 有人交给你一组轨道部件,让你检查一下。 如果它们能连成一条连续的链条,火车就能出发,把欢笑带到 Toyland 的每个角落。 如果不能,这组部件就会被丢弃,再换一组来试。

玩具们都指望你来解开这个谜题。 这些骨牌究竟能连通轨道、让火车跑起来,还是会被搁置一旁?

说明

用多米诺骨牌摆出一条链。

给定一组多米诺骨牌,计算出一种排列方式,使它们组成一条正确的骨牌链。 在这条链中,每块骨牌一端的点数必须与相邻骨牌相接一端的点数相同。 此外,没有相邻骨牌的那两端(也就是第一块和最后一块骨牌)的点数也必须彼此相同。

例如给定骨牌 [2|1]、[2|3] 和 [1|3],你应该算出类似 [1|2] [2|3] [3|1] 或 [3|2] [2|1] [1|3] 或 [1|3] [3|2] [2|1] 这样的排列,其中首尾的数字相同。

对于骨牌 [1|2]、[4|1] 和 [2|3],得到的链是无效的:[4|1] [1|2] [2|3] 的首尾数字不相同。 4 != 3

有些测试用例的链解答中可能会用到重复的骨牌,可以假设用到了多副多米诺骨牌。

实现

定义一个 Go 函数 MakeChain,它接受一个多米诺骨牌切片,并尝试构造一条合法的多米诺骨牌链。

MakeChain 应具有以下签名:

type Domino [2]int

func MakeChain(input []Domino) (chain []Domino, ok bool)

ok 布尔结果表示给定的输入多米诺骨牌切片能否排列成合法的链。 空输入切片被视为合法,而两侧相同的单张多米诺骨牌也被视为合法。

'chain' 结果是包含零个或多个多米诺骨牌的切片,按能够展示合法链的顺序排列。 可以接受(也是意料之中)的是,'input' 中的多米诺骨牌可能需要旋转,以便每一侧都与链中相邻的多米诺骨牌匹配。 链开头和末尾的多米诺骨牌的外侧也必须匹配。

如果给定的输入多米诺骨牌切片无法排列成合法的链,MakeChain 可以为 chain 结果返回 nil,但必须为 ok 结果返回 false。

由于对于给定的输入可能存在不止一种合法的链排列,当ok为 true 时,测试程序只会检查链的合法性。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Go Exercism

准备好开始 多米诺骨牌 了吗?

注册 Exercism,借助 34 个概念165 个练习 和真人导师指导,学习并掌握 Go,全部免费。