在 Toyland,火車總是忙著把寶物運送到城市各處,從閃亮的彈珠到稀有的積木都有。 火車行駛的軌道由一片片色彩繽紛的骨牌狀零件組成,每片零件上都標著 2 個數字。 火車要能前進,骨牌就得排成一條完美的鏈,讓數字兩兩相合。
今天,一批稀有玩具的緊急運送任務正等著處理。 有人交給你一組軌道零件,要你檢查看看。 如果它們能排成一條連續的鏈,火車就能上路,把歡笑帶到 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 時,測試程式只會檢查這條鏈是否合法。