“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为/。