首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查找所有可能的带有递归和回溯的多米诺骨牌链

查找所有可能的带有递归和回溯的多米诺骨牌链
EN

Stack Overflow用户
提问于 2018-01-11 12:18:36
回答 1查看 2.9K关注 0票数 1

我正在进行一个挑战,我需要找到所有的可能性,线性的多米诺骨牌链。我理解递归的原理,但不理解如何将其转换为代码。如果有人能用简单的步骤解释这个问题(解决方案),我就可以遵循这些步骤,并尝试对它们进行编码。

示例: Tiles:3/4 1/4 可能链:3/4-4/1-1/6-6/5

它可以翻转瓷砖。(转换号码)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-11 12:53:28

这个过程非常简单:从多米诺骨牌的集合开始,然后是一个空链C。

代码语言:javascript
运行
复制
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代码:

代码语言:javascript
运行
复制
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 + "]";
    }
}

算法:

代码语言:javascript
运行
复制
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;
}

你的例子:

代码语言:javascript
运行
复制
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);
}    
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48206913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档