这次是关于24点的算法问题,本人只能想到穷举,又没其他思路能减少代码量

xiaoyu_code 2013-07-09 05:34:07
24点算法,实现成程序,貌似有点难度啊
本人只能先到穷举,但是代码量太大了,而且运算一组数要循环几千次。
我觉得一定会有相对简单的思路,能简化代码和运算速度,求各位大牛指教。
...全文
716 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyu_code 2013-07-11
  • 打赏
  • 举报
回复
引用 45 楼 zhaokai115 的回复:
多年前写了个支持分数的,可以计算出 8/(3-8/3)=24 的(据说是微软的面试题,想不出来,只好借助电脑了)
我看过一篇用分数来做的,但是没看懂,不知道用的其他什么思路
  • 打赏
  • 举报
回复
前几个月做了一个24点的swing 回去给你找下
zhaokai115 2013-07-10
  • 打赏
  • 举报
回复
多年前写了个支持分数的,可以计算出 8/(3-8/3)=24 的(据说是微软的面试题,想不出来,只好借助电脑了)
taodm 2013-07-10
  • 打赏
  • 举报
回复
这个题,直接扩到n个数算x才值得讨论。
healer_kx 2013-07-10
  • 打赏
  • 举报
回复
1 + 2 + 3 + 4 无论数字的顺序如何,无论如何结合,这些东西组合在一起,其实就是一个表达式。 我的算法是做到了。
healer_kx 2013-07-10
  • 打赏
  • 举报
回复
引用 41 楼 zhao4zhong1 的回复:
[quote=引用 40 楼 healer_kx 的回复:] [quote=引用 37 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/380157851
正解![/quote] 你的解重复的太多。。。 1 + 2 和 2 + 1 是一会儿事儿,你的代码却说这是两种答案。。。 。。。哎。。。骗3岁以下的小孩可以。。。[/quote] 个人认为 ((黑桃3+红心5)+梅花7)+方块9=24 (黑桃3+(红心5+梅花7))+方块9=24 ((黑桃5+红心3)+梅花7)+方块9=24 是不同的。 [/quote] 是不是一样的,你问问大家。
赵4老师 2013-07-10
  • 打赏
  • 举报
回复
引用 40 楼 healer_kx 的回复:
[quote=引用 37 楼 zhao4zhong1 的回复:] [quote=引用 6 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/380157851
正解![/quote] 你的解重复的太多。。。 1 + 2 和 2 + 1 是一会儿事儿,你的代码却说这是两种答案。。。 。。。哎。。。骗3岁以下的小孩可以。。。[/quote] 个人认为 ((黑桃3+红心5)+梅花7)+方块9=24 (黑桃3+(红心5+梅花7))+方块9=24 ((黑桃5+红心3)+梅花7)+方块9=24 是不同的。
healer_kx 2013-07-10
  • 打赏
  • 举报
回复
引用 37 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/380157851
正解![/quote] 你的解重复的太多。。。 1 + 2 和 2 + 1 是一会儿事儿,你的代码却说这是两种答案。。。 。。。哎。。。骗3岁以下的小孩可以。。。
xiaoyu_code 2013-07-10
  • 打赏
  • 举报
回复
引用 37 楼 zhao4zhong1 的回复:
[quote=引用 6 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/380157851
正解![/quote] 看了,膜拜大牛们啊,35楼的C+11版很给力,赵老师的排版好看不好读
xiaoyu_code 2013-07-10
  • 打赏
  • 举报
回复
引用 36 楼 adlay 的回复:
不只吧 ((AB)C)D (A(BC))D A(B(CD)) ....
这些情况在实际情况下是不存在的呀
赵4老师 2013-07-10
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
http://bbs.csdn.net/topics/380157851
正解!
www_adintr_com 2013-07-10
  • 打赏
  • 举报
回复
引用 35 楼 whereisrxy 的回复:
各位继续啊 我改进了下,全排列改为了p(4,2),然后口号我总结有7中(AB)CD,(ABC)D,AB(CD),A(BCD),A(BC)D,(AB)(CD),ABCD就这7种,木有其他的了吧。 然后就是全排列
引用 18 楼 adlay 的回复:
另外, 我上面的还是没有考虑结合律的情况, ((a + b) + c) + d 与 (a + b) + (c + d) 都认为是不同的.
不只吧 ((AB)C)D (A(BC))D A(B(CD)) ....
xiaoyu_code 2013-07-10
  • 打赏
  • 举报
回复
各位继续啊 我改进了下,全排列改为了p(4,2),然后口号我总结有7中(AB)CD,(ABC)D,AB(CD),A(BCD),A(BC)D,(AB)(CD),ABCD就这7种,木有其他的了吧。 然后就是全排列
引用 18 楼 adlay 的回复:
另外, 我上面的还是没有考虑结合律的情况, ((a + b) + c) + d 与 (a + b) + (c + d) 都认为是不同的.
zhaokai115 2013-07-09
  • 打赏
  • 举报
回复
只有5种表达式树,所以共有5*4!*4^3=5*24*64=7680种组合(没有重复数字的情况,有的话更少) * * * * * / \ / \ / \ / \ / \ * x * x * * x * x * / \ / \ / \ / \ / \ / \ * x x * x xx x * x x * / \ / \ / \ / \ x x x x x x x x
www_adintr_com 2013-07-09
  • 打赏
  • 举报
回复
如果是以找数为目的的话, 我倒是想到一个办法, 只针对一定范围内可以重复使用数的情况: 首先找出哪两个数进行加减乘除可以得到 24 的, 假设为 A 和 B. 然后再找怎么组合成 A, 怎么组合成 B. 组合成具体某一个数的方法可以缓存, 如果以后又遇到需要这个数的话, 直接从缓存里面取.
bijiDango 2013-07-09
  • 打赏
  • 举报
回复
还可以改进算法啊,,比如达到24的终极方式有加减乘除四种 你可以考虑怎么拼凑出元素
healer_kx 2013-07-09
  • 打赏
  • 举报
回复
你也可以先得出结果,然后再filter,但是这样比较废内存,印象里,不考虑结合律,结果是w级别的。
healer_kx 2013-07-09
  • 打赏
  • 举报
回复
引用 27 楼 adlay 的回复:
[quote=引用 26 楼 healer_kx 的回复:] [quote=引用 24 楼 adlay 的回复:] [quote=引用 21 楼 healer_kx 的回复:] 我先问你一个问题,我们谈的24点,是1-13这13个数字的任意4个组合构成的。。。是吧? 你的表达式里面,连数字的范围都没有体现出来。。。结果怎么可能对呢? 那1-20这20个数字,任意取4个,最后的结果怎么可能还是3888?
原来我们理解的都不是一个问题..... 你是在说 1~13 总共有多少种得到结果 24 的. 我是在说, 给定 4 个数字, 他们的运算方式有多少种... 然后遍历所有的这么多种情况去找出哪些结果是 24 的... [/quote] 你没看 赵老师的代码,另外任意4个数字。。。运算方式有多少种也没啥意义,有些就不可能有结果。[/quote] 看穷举的复杂度有多高撒. 你可以根据什么来预先就排除不可能有结果的吗?[/quote] 我的算法能排除这些东西。 a + b = b + a a * b = b * a. 等等。 loop一个值的时候,我会给出优化的范围。 另外就是我5楼的回复。。。
www_adintr_com 2013-07-09
  • 打赏
  • 举报
回复
还有一种 24 点就是要找出所有组合成 24 的方式. 不是找到一种就结束.
www_adintr_com 2013-07-09
  • 打赏
  • 举报
回复
引用 26 楼 healer_kx 的回复:
[quote=引用 24 楼 adlay 的回复:] [quote=引用 21 楼 healer_kx 的回复:] 我先问你一个问题,我们谈的24点,是1-13这13个数字的任意4个组合构成的。。。是吧? 你的表达式里面,连数字的范围都没有体现出来。。。结果怎么可能对呢? 那1-20这20个数字,任意取4个,最后的结果怎么可能还是3888?
原来我们理解的都不是一个问题..... 你是在说 1~13 总共有多少种得到结果 24 的. 我是在说, 给定 4 个数字, 他们的运算方式有多少种... 然后遍历所有的这么多种情况去找出哪些结果是 24 的... [/quote] 你没看 赵老师的代码,另外任意4个数字。。。运算方式有多少种也没啥意义,有些就不可能有结果。[/quote] 看穷举的复杂度有多高撒. 你可以根据什么来预先就排除不可能有结果的吗?
加载更多回复(26)

64,684

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧