首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Challenge24 Solver实现背后的理论

Challenge24 Solver实现背后的理论
EN

Stack Overflow用户
提问于 2011-08-17 03:29:46
回答 3查看 1.2K关注 0票数 2

作为Java和android开发的介绍,我决定编写一个Challenge24(给定4个数字,必须加、乘、除或减才能创建乘积24)求解应用程序,它实现了一种详尽的技术来求解任何和所有可能的解。目前它是这样工作的(a,b,c,d是4个输入数)

代码语言:javascript
复制
((a+b)+c)+d
((a+b)+c)-d
((a+b)+c)*d
((a+b)+c)/d
((a+b)-c)+d
...
...
((a/b)/c)/d
((a+b)+d)+c
((a+b)+d)-c

以此类推。

我发现这在绝大多数情况下都有效,但是像8,3,8,3这样的情况在测试中没有找到解决方案,但是解决方案8/(3-8/3)=24是正确的。所以我猜最后的问题是相当模糊的,但是如何实现这一点来解释括号对于找到解决方案至关重要的情况?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-17 04:46:47

将变量a、b、c、d视为输入,将+、-、*、/视为运算符

您将始终拥有三个运算符

代码语言:javascript
复制
a op b op c op d

现在我们来看一下下面的括号组合

代码语言:javascript
复制
1 group of 2
(a op b) op c op d
a op (b op c) op d
a op b op (c op d)

1 group of 3
(a op b op c) op d
a op (b op c op d)

each 3 can be comprised 
(x op y op z) as above example
(x op (y op z))
((x op y) op z)

Also, 2 groups of 2
(a op b) op (c op d)

现在,您必须使用每组操作测试上面的每种组合:

代码语言:javascript
复制
 Haha silly code parser, you think these are comments in here... tsk tsk
 +++, ++-, ++*, ++/, +-+, +--, +-*, +-/,
 +*+, +*-, +**, +*/, +/+, +/-, +/*, +//,
 -++, -+-, -+*, -+/, --+, ---, --*, --/,
 -*+, -*-, -**, -*/, -/+, -/-, -/*, -//,
 *++, *+-, *+*, *+/, *-+, *--, *-*, *-/,
 **+, **-, ***, **/, */+, */-, */*, *//,
 /++, /+-, /+*, /+/, /-+, /--, /-*, /-/,
 /*+, /*-, /**, /*/, //+, //-, //*, ///

因此,使用这些操作测试每组两个,每组三个(包括简单版本和嵌套版本),一个具有两组两个。

据我估计,总共有640次测试。

这可以在逻辑上减少,例如,如果为op1 == op2 == op3,则括号不重要。你还可以做其他的减少。

编辑:然后,您需要遍历a、b、c、d的每个排列,这将使总数达到15,360 (当然,如果有重复的话会更少)。

票数 0
EN

Stack Overflow用户

发布于 2011-08-17 03:43:33

如果您想继续详尽无遗,请为每种可能的括号组合创建条件。

票数 3
EN

Stack Overflow用户

发布于 2011-08-17 05:47:41

我会通过枚举前缀或后缀表示法中可能的运算符/操作数组合,或者构建表达式树来实现这一点。这应该会使在循环和/或函数中表达它们变得更容易。然后,您可以将解决方案转换为用于输出的中缀;如果您不关心多余的括号,这将非常简单。

也许你可以通过这种方式对搜索顺序进行优化,但问题空间很小,我不会费心去做。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7083869

复制
相关文章

相似问题

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