最新消息:点击查看大S的省钱秘笈

求解二十四点的所有解 C++版

编程相关 Slyar 268浏览 0评论

文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号等进行运算得出24。每张牌都必须使用一次,但不能重复使用。

简单说就是给你4个数(1-13),数字可以重复,然后让你运用加、减、乘、除和括号运算得出24,每个数字必须使用一次,但不能重复使用。当然,运算中出现的分数是允许的,如1 5 5 5和3 3 8 8这两组数字得到的24点表达式为((5-(1/5))*5) 和 (8/(3-(8/3))),是不是很变态?

因为表达式是字符串,所以这次我没有用C语言实现,而是选择了具有string类型的C++语言,这样可以更好地处理字符串。在代码中我还使用了STL的Vector来过滤掉重复的解,感叹STL的方便之余对迭代器的使用也有了更深的认识。

至于24点求解的算法,仔细研究一下24点解集,可以发现解的形式无非就是2种。一种是(((A,B),C),D),另一种是((A,B),(C,D))。有了这个发现,就可以在很大程度上避免对于括号的处理,接下来的工作就是...枚举,哈哈。

花了3个多小时敲代码,注释我写得很清晰了,测试了很多组数据,目前没有发现bug,下面是代码。

转载请注明:Slyar Home » 求解二十四点的所有解 C++版

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

网友最新评论 (8)

  1. @woejoy 呵呵,编译器的问题,那种写法要求C99,很多老的编译器依旧是C98标准。
    Slyar5年前 (2011-07-13)回复
  2. 如果你那边运行没错,那就是我的vc++6.0编译器出问题了,我这边编译的时候提示出错,我删了那一行的int就可以了。我不是内行,不知道什么理由,无法告知,留言只是说明我在使用你的代码时的结果,谢谢。@Slyar
    woejoy5年前 (2011-07-13)回复
  3. @woejoy 呵呵,为什么要删去呢?没有理由的。
    Slyar6年前 (2011-07-02)回复
  4. 经运行,218行的int需要删去,望检查。
    woejoy6年前 (2011-07-02)回复
  5. @felix021 啊,这不是前一段一直被其他程序阻碍了嘛,嘿嘿... 恩,我知道next_permutation和prev_permutation,不过因为要判重嘛,所以就直接写了...
    Slyar7年前 (2009-10-31)回复
  6. 对了,顺便说一下,stl的algorithm里面有两个函数分别是 next_permutation prev_permutation
    felix0217年前 (2009-10-31)回复
  7. 唔,可以正常算出3388和1555的解,赞~ 不过你说要研究这个算法可是5个月以前的事情了啊。。。 详见这篇的评论:https://www.felix021.com/blog/read.php?1602
    felix0217年前 (2009-10-31)回复
  8. 你好NB,我自叹不如
    hdlover7年前 (2009-10-31)回复