暴力搜索算法的典型应用——24点游戏

本文介绍了如何使用暴力搜索算法解决24点游戏以及类似的问题,即判断给定的数是否能通过加、减、乘、除运算得到目标数。通过动态数组存储数字,依次选择两个数进行运算并更新数组,直至只剩一个元素。文章还提出了一种改进方案,使用vector记录每步操作,便于查看运算过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“24点”是个棋牌类益智游戏,要求四个数字运算结果等于二十四。这种类型的题目可以通过编写程序让计算机完成。一个更具有普遍性的题目如下:

每次给若干个数和一个目标数,让你判断,利用这些数能否通过简单的运算(加,减,乘,除)得到那个目标数。如果能则输出目标数,否则输出这几个数能凑到的小于目标数的最大的那个数。备注:要求每个数都要用到,并且除法必须要求能够进行整除,否则就不能进行除法;例如,4/2可以,1/7和9/4就不可以。

例1:

输入五个数为:1 2 3 7 100;目标数为:573

输出:573 (因为:(((100-1)*2)-7)*3 = 573)

 

例2:

输入五个数为:67 69 58 22 2;目标数为:929

输出:923 (因为:(22-(67-58))*(69+2)=923)


例3:

输入四个数为:1 3 7 13;目标数为:30

输出:30(因为:((7*13)-1)/3=30)


用暴力搜索算法枚举所有可能性即可解决此问题。在这里我介绍一下我的解决思路:首先用一个动态数组(在C++中,推荐用STL标准库中的vector来实现动态数组)储存这几个数。然后每一步在数组中任选两个数,对它们进行其中一种运算:+、-、*、/(注意,减法和除法不满足交换律),并在原数组中删除选出的那两个数,把运算结果添加到数组中。经过这一步后,数组的长度就会-1。依此类推,直到数组的长度变为1,搜索结束,数组中剩下的那个元素就是结果,将它与之前得到的结果进行比较,选取更优的结果。

这里作一点小改进:

用一个vector来保存每一步对数字的操作,这样就可以看到具体的过程和步骤。下面的代码中,我用一个vector<int>来保存每一步的操作。vector<int>大小为4*(m-1),m为输入的数字的个数。vector以四个数字为一个分组代表一步操作,第一个和第二个数字表示操作数,第三个数字表示结果,第四个数字表示操作符:0为+、1为-、2为*、3为/。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值