使用递归和回溯查找所有可能的多米诺骨牌链[关闭]
Posted
技术标签:
【中文标题】使用递归和回溯查找所有可能的多米诺骨牌链[关闭]【英文标题】:Find all possible dominoes chains with recursion and backtracking [closed] 【发布时间】:2018-01-11 12:18:36 【问题描述】:我正在进行一项挑战,我需要找到所有可能的多米诺骨牌线性链。我了解递归的原理,但不了解如何将其转换为代码。如果有人可以用简单的步骤解释问题(解决方案),我可以按照这些步骤尝试编写代码。
例子:
图块:[3/4] [5/6] [1/4] [1/6]
可能的链:[3/4]-[4/1]-[1/6]-[6/5]
允许翻转瓷砖。 (交换数字)
【问题讨论】:
是所有可能的链还是使用所有多米诺骨牌的所有可能链? 请先试一试,然后再回来提出与您的实施问题相关的具体问题。目前,您刚刚发布了需求转储。如果这是为了你的研究,练习的重点是解释需求并自己使用所需的技术设计解决方案。 @spacedk 问问自己如何处理一组真正的多米诺骨牌,然后尝试将其转换为逻辑。如果您使用递归,请尝试确定您的基本情况和递归情况。 请不要破坏您的帖子。通过在 Stack Exchange 网络上发布,您已授予 SE 以 CC BY-SA 3.0 license 分发该内容的不可撤销的权利。根据 SE 政策,任何破坏行为都将被撤销。 正如 iBug 所说,不要破坏您的帖子。我已经回滚了你的破坏性编辑。不要再这样做了。 【参考方案1】:过程非常简单:从多米诺骨牌集合 D 和空链 C 开始。
for each domino in the collection:
see if it can be added to the chain (either the chain is empty, or the first
number is the same as the second number of the last domino in the chain.
if it can,
append the domino to the chain,
then print this new chain as it is a solution,
then call recursively with D - domino and C + domino
repeat with the flipped domino
Java 代码:
public class Domino
public final int a;
public final int b;
public Domino(int a, int b)
this.a = a;
this.b = b;
public Domino flipped()
return new Domino(b, a);
@Override
public String toString()
return "[" + a + "/" + b + "]";
算法:
private static void listChains(List<Domino> chain, List<Domino> list)
for (int i = 0; i < list.size(); ++i)
Domino dom = list.get(i);
if (canAppend(dom, chain))
chain.add(dom);
System.out.println(chain);
Domino saved = list.remove(i);
listChains(chain, list);
list.add(i, saved);
chain.remove(chain.size()-1);
dom = dom.flipped();
if (canAppend(dom, chain))
chain.add(dom);
System.out.println(chain);
Domino saved = list.remove(i);
listChains(chain, list);
list.add(i, saved);
chain.remove(chain.size()-1);
private static boolean canAppend(Domino dom, List<Domino> to)
return to.isEmpty() || to.get(to.size()-1).b == dom.a;
你的例子:
public static void main(String... args)
List<Domino> list = new ArrayList<>();
// [3/4] [5/6] [1/4] [1/6]
list.add(new Domino(3, 4));
list.add(new Domino(5, 6));
list.add(new Domino(1, 4));
list.add(new Domino(1, 6));
List<Domino> chain = new ArrayList<>();
listChains(chain, list);
【讨论】:
以上是关于使用递归和回溯查找所有可能的多米诺骨牌链[关闭]的主要内容,如果未能解决你的问题,请参考以下文章