最长的多米诺骨牌链/序列

编程入门 行业动态 更新时间:2024-10-12 01:25:04
本文介绍了最长的多米诺骨牌链/序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

给定一组 12 个随机挑选的多米诺骨牌,我需要找到可能的最长多米诺骨牌链.我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性).多米诺骨牌由一块砖"组成,上面有两个正方形:[a|b] 其中 0 =

I need to find the longest chain of dominoes possible, given a set of 12 randomly picked dominoes. I've already recursively generated all possibilities of dominoes (there are 91 possibilities using face values of 0 to 12). A domino consists of one "brick" with two squares on it: [a|b] where 0 =< a, b <= 12. Thus, an example of a domino could be [12, 0] or [6, 3] etc. Dominoes may be connect if adjacent halves have the same value.

多米诺骨牌可以翻转以适应比赛.例如,给定 [8, 4], [9, 4] 可以翻转成对 [8, 4][4, 9]

Dominoes may be flipped to accommodate a match. For example, given [8, 4], [9, 4] could be flipped to make the pair [8, 4][4, 9]

以下(与此问题相关)方法可用于此类:

The following (relevant to this question) methods are available for this class:

void flipEnds(); // Flips the domino int getLeft() const; int getRight() const; bool hasBeenPlayed() const; void setPlayed(bool value);

所以,这个问题的样本数据如下:

So, sample data for this problem would be as follows:

myDomino #0: [1 12 ] myDomino #1: [0 5 ] myDomino #2: [7 9 ] myDomino #3: [2 7 ] myDomino #4: [7 12 ] myDomino #5: [4 8 ] myDomino #6: [8 10 ] myDomino #7: [3 11 ] myDomino #8: [11 12 ] myDomino #9: [10 11 ] myDomino #10: [2 9 ] myDomino #11: [2 4 ]

这更像是一道数学题,但我怎样才能找到最长的多米诺骨牌链呢?我认为它必须递归完成.

This is more of a math problem, but how can I find the longest chain of dominoes? I assume it must be done recursively.

推荐答案

多米诺骨牌序列可能表示为 {#3,Y}, {#4,N}, {#0,Y}, ...第一个数字是您手中的多米诺骨牌号码,第二个数字是是否翻转.我们想检查每一个可能的序列,但尽早修剪明显非法的序列.

A sequence of dominos might be represented as {#3,Y}, {#4,N}, {#0,Y}, ... The first number is the number of the domino in your hand and the second is whether it is flipped or not. We want to check every possible sequence, but prune obviously illegal one early.

假设您有一个函数 testSequence(sequence) 测试序列是否有效.保留两个列表,一个是当前序列 currentSeq,另一个是您尚未选择的 unused.

Lets assume you have a function testSequence(sequence) which tests is a sequence is valid. Keep two lists, one of the current sequence currentSeq, and one of the dominos you have not yet chosen unused.

递归可能类似于

checkAllSeq( currentSeq, unused ) { foreach( domino in unused ) { unused2 = unused - domino // remove domino from unused list seq1 = currentSeq + {domino,true} // add unfliped domino to sequence to test if( testSequence(seq1) ) { checkAllSeq(seq1,unused2) // recurse } // now do it with the domino flipped seq2 = currentSeq + {domino,false} if( testSequence(seq2) ) { checkAllSeq(seq2,unused2) } } }

我错过了一些事情.这只是测试所有可能的序列,它不会对结果做任何事情.

I've missed a few things out. This just tests all possible sequences it does not do anything with the result.

更多推荐

最长的多米诺骨牌链/序列

本文发布于:2023-11-29 11:43:46,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1646302.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:序列   最长   多米诺骨牌

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!