二十四点游戏技巧(3,13,12,13)

你的位置: >
> 求解二十四点的所有解 C++版
文章作者:姜南(Slyar) 文章来源:Slyar Home () 转载请注明,谢谢合作。
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,下面是代码。
#include &iostream&
#include &string&
#include &vector&
#include &algorithm&
#include &iterator&
#include &cmath&
/* 存放解集 */
vector&string&
/* 第1个数和第2个数的值及表达式 */
double key1_2[6] = {0};
string exp1_2[6];
/* 第3个数和第4个数的值及表达式 */
double key3_4[6] = {0};
string exp3_4[6];
/* 第3个数和前2个数的值及表达式 */
double key12_3[6] = {0};
string exp12_3[6];
/* 第4个数和前3个数的值及表达式 */
double key123_4[6] = {0};
string exp123_4[6];
/* 前2个数和后2个数的值及表达式 */
double key12_34[6] = {0};
string exp12_34[6];
/* 函数声明 */
int Permutation(int[], int[][4]);
void Calc(double, double, double[], string[], string, string);
void Work(int[], int[][4], int);
/* 主函数 */
int main()
int num[4] = {0};
int array[24][4] = {0};
int count = 0;
cout && "请输入4个1-13之间的整数,中间以空格隔开" &&
/* 读入数据 */
for (int i = 0; i & 4; i++)
cin && num[i];
/* 待检测数据的数量 */
count = Permutation(num, array);
/* 求解24点 */
Work(num, array, 24);
/* 对结果进行排序 */
sort(ivec.begin(), ivec.end());
/* 去掉重复的解 */
vector&string&::iterator iter = unique(ivec.begin(), ivec.end());
/* 输出解集 */
if (ivec.size() != 0)
cout && "该组数据的解集为:" &&
for (vector&string&::iterator it = ivec.begin(); it != it++)
cout && *it &&
cout && "该组数据无解" &&
system("pause");
/* 计算2个数,保存值及表达式 */
void Calc(double a, double b, double key[], string exp[], string expa, string expb)
key[0] = a +
exp[0] = '(' + expa + '+' + expb + ')';
key[1] = a -
exp[1] = '(' + expa + '-' + expb + ')';
key[2] = b -
exp[2] = '(' + expb + '-' + expa + ')';
key[3] = a *
exp[3] = '(' + expa + '*' + expb + ')';
if (b & 0)
key[4] = a /
exp[4] = '(' + expa + '/' + expb + ')';
if (a & 0)
key[5] = b /
exp[5] = '(' + expb + '/' + expa + ')';
/* 生成数据的排列组合 */
int Permutation(int num[], int array[][4])
int k = 0;
int count = 0;
int i, j, m, n,
for (i = 0; i & 4; i++)
for (j = 0; j & 4; j++)
for (m = 0; m & 4; m++)
for (n = 0; n & 4; n++)
if (i != j && i != m && i != n && j != m && j != n && m != n)
for(s = 0; s & s++)
if(array[s][0] == num[i] && array[s][1] == num[j] && array[s][2] == num[m] && array[s][3] == num[n])
if (flag == 1)
array[k][0] = num[i];
array[k][1] = num[j];
array[k][2] = num[m];
array[k][3] = num[n];
/* 求解24点 */
void Work(int num[], int array[][4], int count)
for (int i = 0; i & i++)
char buffer[20];
string expa,
/* 转换第1个数字为表达式 */
itoa(array[i][0], buffer, 10);
/* 转换第2个数字为表达式 */
itoa(array[i][1], buffer, 10);
/* 计算第1个数和第2个数 */
Calc(array[i][0], array[i][1], key1_2, exp1_2, expa, expb);
/* (((A,B),C),D)形式 */
for (int j = 0; j & 6; j++)
/* 转换第3个数字为表达式 */
itoa(array[i][2], buffer, 10);
/* 计算第3个数和前2个数 */
Calc(key1_2[j], array[i][2], key12_3, exp12_3, exp1_2[j], expb);
for (int k = 0; k & 6; k++)
/* 转换第4个数字为表达式 */
itoa(array[i][3], buffer, 10);
/* 计算第4个数和前3个数 */
Calc(key12_3[k], array[i][3], key123_4, exp123_4, exp12_3[k], expb);
for (int t = 0; t & 6; t++)
if (fabs(key123_4[t] - 24) & 1e-6)
ivec.push_back(exp123_4[t]);
/* 转换第3个数字为表达式 */
itoa(array[i][2], buffer, 10);
/* 转换第4个数字为表达式 */
itoa(array[i][3], buffer, 10);
/* 计算第3个数和第4个数 */
Calc(array[i][2], array[i][3], key3_4, exp3_4, expa, expb);
/* ((A,B),(C,D))形式 */
for (int j = 0; j & 6; j++)
for (int k = 0; k & 6; k++)
/* 计算前2个数和后2个数 */
Calc(key1_2[j], key3_4[k], key12_34, exp12_34, exp1_2[j], exp3_4[k]);
for (int t = 0; t & 6; t++)
if (fabs(key12_34[t] - 24) & 1e-6)
ivec.push_back(exp12_34[t]);
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
/*Slyar*/&#include &iostream&&&#include &string&#include &vector&#include &algorithm&#include &iterator&#include &cmath&&using namespace std;&/* 存放解集 */vector&string& ivec;&/* 第1个数和第2个数的值及表达式 */double key1_2[6] = {0};string exp1_2[6];&/* 第3个数和第4个数的值及表达式 */double key3_4[6] = {0};string exp3_4[6];&/* 第3个数和前2个数的值及表达式 */double key12_3[6] = {0};string exp12_3[6];&/* 第4个数和前3个数的值及表达式 */double key123_4[6] = {0};string exp123_4[6];&/* 前2个数和后2个数的值及表达式 */double key12_34[6] = {0};string exp12_34[6];&/* 函数声明 */int Permutation(int[], int[][4]);void Calc(double, double, double[], string[], string, string);void Work(int[], int[][4], int);&/* 主函数 */int main(){&&&&int num[4] = {0};&&&&int array[24][4] = {0};&&&&int count = 0;&&&&&&&&cout && "请输入4个1-13之间的整数,中间以空格隔开" && endl;&&&&&&&&/* 读入数据 */&&&&for (int i = 0; i & 4; i++)&&&&{&&&&&&&&cin && num[i];&&&&}&&&&&&&&/* 待检测数据的数量 */&&&&count = Permutation(num, array);&&&&&&&&/* 求解24点 */&&&&Work(num, array, 24);&&&&&&&&/* 对结果进行排序 */&&&&sort(ivec.begin(), ivec.end());&&&&&&&&/* 去掉重复的解 */&&&&vector&string&::iterator iter = unique(ivec.begin(), ivec.end());&&&&&&&&/* 输出解集 */&&&&if (ivec.size() != 0)&&&&{&&&&&&&&cout && "该组数据的解集为:" && endl;&&&&&&&&for (vector&string&::iterator it = ivec.begin(); it != iter; it++)&&&&&&&&{&&&&&&&&&&&&cout && *it && endl;&&&&&&&&}&&&&}&&&&else&&&&{&&&&&&&&cout && "该组数据无解" && endl;&&&&}&&&&&&&&system("pause");&&&&return 0;}&/* 计算2个数,保存值及表达式 */void Calc(double a, double b, double key[], string exp[], string expa, string expb){&&&&key[0] = a + b;&&&&exp[0] = '(' + expa + '+' + expb + ')';&&&&&&&&key[1] = a - b;&&&&exp[1] = '(' + expa + '-' + expb + ')';&&&&&&&&key[2] = b - a;&&&&exp[2] = '(' + expb + '-' + expa + ')';&&&&&&&&key[3] = a * b;&&&&exp[3] = '(' + expa + '*' + expb + ')';&&&&&&&&if (b & 0)&&&&{&&&&&&&&key[4] = a / b;&&&&&&&&exp[4] = '(' + expa + '/' + expb + ')';&&&&}&&&&&&&&if (a & 0)&&&&{&&&&&&&&key[5] = b / a;&&&&&&&&exp[5] = '(' + expb + '/' + expa + ')';&&&&}}&/* 生成数据的排列组合 */int Permutation(int num[], int array[][4]){&&&&int flag;&&&&int k = 0;&&&&int count = 0;&&&&int i, j, m, n, s;&&&&for (i = 0; i & 4; i++)&&&&{&&&&&&&&for (j = 0; j & 4; j++)&&&&&&&&{&&&&&&&&&&&&for (m = 0; m & 4; m++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&for (n = 0; n & 4; n++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&if (i != j && i != m && i != n && j != m && j != n && m != n)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&flag = 1;&&&&&&&&&&&&&&&&&&&&&&&&for(s = 0; s & k; s++)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&if(array[s][0] == num[i] && array[s][1] == num[j] && array[s][2] == num[m] && array[s][3] == num[n])&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&flag = 0;&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&if (flag == 1)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&array[k][0] = num[i];&&&&&&&&&&&&&&&&&&&&&&&&&&&&array[k][1] = num[j];&&&&&&&&&&&&&&&&&&&&&&&&&&&&array[k][2] = num[m];&&&&&&&&&&&&&&&&&&&&&&&&&&&&array[k][3] = num[n];&&&&&&&&&&&&&&&&&&&&&&&&&&&&k++;&&&&&&&&&&&&&&&&&&&&&&&&&&&&count++;&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}&&&&return count;}&/* 求解24点 */void Work(int num[], int array[][4], int count){&&&&for (int i = 0; i & count; i++)&&&&{&&&&&&&&char buffer[20];&&&&&&&&string expa, expb;&&&&&&&&&&&&&&&&/* 转换第1个数字为表达式 */&&&&&&&&itoa(array[i][0], buffer, 10);&&&&&&&&expa = buffer;&&&&&&&&&&&&&&&&/* 转换第2个数字为表达式 */&&&&&&&&itoa(array[i][1], buffer, 10);&&&&&&&&expb = buffer;&&&&&&&&&&&&&&&&/* 计算第1个数和第2个数 */&&&&&&&&Calc(array[i][0], array[i][1], key1_2, exp1_2, expa, expb);&&&&&&&&&&&&&&&&/* (((A,B),C),D)形式 */&&&&&&&&for (int j = 0; j & 6; j++)&&&&&&&&{&&&&&&&&&&&&/* 转换第3个数字为表达式 */&&&&&&&&&&&&itoa(array[i][2], buffer, 10);&&&&&&&&&&&&expb = buffer;&&&&&&&&&&&&&&&&&&&&&&&&/* 计算第3个数和前2个数 */&&&&&&&&&&&&Calc(key1_2[j], array[i][2], key12_3, exp12_3, exp1_2[j], expb);&&&&&&&&&&&&&&&&&&&&&&&&for (int k = 0; k & 6; k++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&/* 转换第4个数字为表达式 */&&&&&&&&&&&&&&&&itoa(array[i][3], buffer, 10);&&&&&&&&&&&&&&&&expb = buffer;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&/* 计算第4个数和前3个数 */&&&&&&&&&&&&&&&&Calc(key12_3[k], array[i][3], key123_4, exp123_4, exp12_3[k], expb);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&for (int t = 0; t & 6; t++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&if (fabs(key123_4[t] - 24) & 1e-6)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&ivec.push_back(exp123_4[t]);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&} &&&&&&&&}&&&&&&&&&&&&&&&&/* 转换第3个数字为表达式 */&&&&&&&&itoa(array[i][2], buffer, 10);&&&&&&&&expa = buffer;&&&&&&&&&&&&&&&&/* 转换第4个数字为表达式 */&&&&&&&&itoa(array[i][3], buffer, 10);&&&&&&&&expb = buffer;&&&&&&&&&&&&&&&&/* 计算第3个数和第4个数 */&&&&&&&&Calc(array[i][2], array[i][3], key3_4, exp3_4, expa, expb);&&&&&&&&&&&&&&&&/* ((A,B),(C,D))形式 */&&&&&&&&for (int j = 0; j & 6; j++)&&&&&&&&{&&&&&&&&&&&&for (int k = 0; k & 6; k++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&/* 计算前2个数和后2个数 */&&&&&&&&&&&&&&&&Calc(key1_2[j], key3_4[k], key12_34, exp12_34, exp1_2[j], exp3_4[k]);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&for (int t = 0; t & 6; t++)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&if (fabs(key12_34[t] - 24) & 1e-6)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&ivec.push_back(exp12_34[t]);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}}
转载请注明: &
与本文相关的文章您的位置:
二十四点v1.1
刚毕业的小伙伴们都在为找工作而烦恼吗?想要找到适合自己的专业相关的工作,做自己喜欢的事情,所以游迅网小编特别为您推荐下面这些求职便捷软件,为您提供海量工作资讯,…
现在很多事情都是要排队,通常要等很久,有的时候运气不好等的更久,很烦人。所以游迅网小编诚心为您推荐下面这些便捷预约软件,让您早先预约,不管是去吃饭,医院等等,都…
二十四点v1.1
本站仅创建用户沟通交流的平台,所展示的安卓软件资源内容来自于第三方上传分享,版权问题均与我站无关。资源仅作为用户间分享讨论之用,除开发商授权外不以盈利为目的。如该游戏触犯了您的权利,请申诉!邮箱:
热门游戏:
最新游戏:
网络游戏:
CopyRight2004年-年
游迅网 All Rights Reserved
备案编号:沪ICP备号-9当前位置:
>>>有一种“二十四点”的游戏,其游戏规则是这样的:任取四个1~13之间的..
有一种“二十四点”的游戏,其游戏规则是这样的:任取四个1~13之间的自然数,将这四个数(每个数用且只用一次)进行加减乘除四则运算,使其结果等于24,例如1,2,3,4,可作如下运算:(1+2+3)×4=24.(注意上述运算与4×(2+3+1)应视作相同方法的运算)现有四个有理数3,4,﹣6,10.运用上述规则写出三种不同方法的运算式,使其结果等于24,运算式如下:(1) _________ ;(2) _________ ;(3) _________ .另有四个数3,﹣5,7,﹣13,可通过运算式(4) _________ 使其结果等于24.
题型:解答题难度:中档来源:湖北省期末题
解:(1)10﹣4﹣3×(﹣6)=24;(2)4﹣10×(﹣6)÷3=24;(3)3×[10+4+(﹣6)]=24;(4)[(﹣5)×(﹣13)+7] ÷3=24.
马上分享给同学
据魔方格专家权威分析,试题“有一种“二十四点”的游戏,其游戏规则是这样的:任取四个1~13之间的..”主要考查你对&&有理数的混合运算&&等考点的理解。关于这些考点的“档案”如下:
现在没空?点击收藏,以后再看。
因为篇幅有限,只列出部分考点,详细请访问。
有理数的混合运算
有理数的混合运算:是一个运算式子中有加有减有乘有除有次方等运算方式的混合运算方式。有理数混合运算的规律:(1)先乘方,再乘除,最后加减; (2)同级运算,从左到右进行; (3)若有括号,先做括号内的运算,按小括号、中括号、大括号依次进行计算。
发现相似题
与“有一种“二十四点”的游戏,其游戏规则是这样的:任取四个1~13之间的..”考查相似的试题有:
719223121829534238541237204532456929二十四点游戏,3,4,-6,-10.三种不同的算式
14-10-18 &匿名提问
生活达人,SEO专家
3&×&(4&+(-&6)&+&10)=24&&10-(3&×&(-6)&&-4=24&&6-3&×&(4+(-10))&=24
请登录后再发表评论!

我要回帖

更多关于 有一种二十四点的游戏 的文章

 

随机推荐