![]() |
1
15
街道和集合中的值之和可以除以3:
所以,如果你把所有的数字加在一起,你会得到一个3N+2M形式的数字,其中M是两个平铺的值。除以3的余数(
因此,不必测试九对可能的对,只需根据一个简单的加法尝试三对。对于每个可能的对,删除两个具有该值的平铺,然后转到算法的下一步以确定是否可能。 一旦有了这个,就从最低的值开始。如果该值少于三个平铺,则表示它们一定是街道的第一个元素,因此删除该街道(如果由于缺少平铺n+1或n+2而无法删除,则表示手无效)并移到下一个最低值。 如果至少有三个最小值的瓷砖,请将它们作为一组移除(如果您问“如果它们是街道的一部分,会怎样?”如果它们是,那么还有3个tile n+1和3个tile n+2,它们也可以变成一组)并继续。
例如,对于无效手,总数是60,这意味着M={3,6,9}:
以你的第二个例子
第三个例子11223378888999也有78个,这导致了回溯:
|
![]() |
2
2
有一个特殊的情况,你需要做一些重新工作,以使它正确。这种情况发生在有一个运行三和一对具有相同的价值(但在不同的西装)。
但由于3“c4”瓷砖出现在2 d4瓷砖之前,因此前2个c4瓷砖将作为一对拾取,留下一个孤立的c4和2 d4,而这3个瓷砖不会形成有效的集。 在这种情况下,您需要将2个c4平铺“返回”到手(并保持手排序),然后搜索满足条件的下一个平铺(值==4)。要做到这一点,您需要让代码“记住”它已经尝试过c4,所以在下一次迭代中,它应该跳过c4并寻找值为=4的其他分片。代码会有点混乱,但可行。 |
![]() |
3
1
您还可以执行步骤1.5,检查每种类型的可用性是否足够。这一步和第二步将是您能够创建通用算法的地方。第一步将是相同的所有数量的瓷砖和可能的组合迅速。 |