【发布时间】:2013-04-10 17:28:59
【问题描述】:
这实际上是一个基于麻将的问题,但是基于 Romme 甚至扑克的背景也很容易理解。
在麻将中,14 张牌(牌就像扑克牌中的牌)被排列成 4 组和一对。一条街道(“123”)总是使用恰好 3 个瓷砖,不多也不少。一组相同类型(“111”)也正好由 3 个牌组成。这导致总和为 3 * 4 + 2 = 14 个图块。
有各种例外情况,例如 Kan 或十三孤儿,与此处无关。颜色和值范围 (1-9) 对算法也不重要。
我正在尝试确定是否可以按照上述方式排列一只手。由于某些原因,它不仅应该能够处理 14 个瓷砖,而且应该能够处理任意数量的瓷砖。 (下一步是找出需要交换多少牌才能完成一手牌。)
例子:
11122233344455 - 很简单,4 套一对。12345555678999 - 123, 456, 789, 555, 9911223378888999 - 123, 123, 789, 888, 9911223344556789 - 无效牌
我目前尚未实施的想法是:对于每个图块,尝试制作 a) 一条街道 b) 一组 c) 一对。如果没有一个有效(或者会有 > 1 对),则返回上一个迭代并尝试下一个选项,或者,如果这是最高级别,则失败。否则,从剩余图块列表中删除已使用的图块并继续下一次迭代。
我相信这种方法行得通,而且速度也相当快(性能是“不错的奖励”),但我对您对此的看法很感兴趣。你能想到替代解决方案吗?这个或类似的东西已经存在了吗?
【问题讨论】:
-
哦哦哦我知道了,我会用正则表达式!!11!
-
有些人在遇到问题时会想“我知道,我会使用正则表达式”。现在他们有两个问题。~ Jamie Zawinski :)
-
您最多可以拆分三组试图形成一条街道(或相反)。可以吗?
-
说真的,我认为正则表达式在这里可能很有用。我手头没有语法,因为我很少使用它,但它应该很容易。至少对于不强调速度和可扩展性的“临时”解决方案而言。
-
@bel:是的,你可以拆散任何东西,只要你最终得到 4 套/街道和一对。哦,顺便说一句,街道上没有没有 1/9 环绕。