求一个24点游戏c语言代码的c++代码

C++算24点程序-1
7页 5财富值 C++程序速算24点 2页 1财富值如要投诉违规内容,请到百度文库投诉中心;如要提出功能问题或意见建议,请点击此处进行反馈。 ...
一个算24点的程序 隐藏&& #include &stdio.h& #include &stdlib.h& #include &math.h& #include
#include &conio.h& #include &string.h& #include &...
24点游戏程序(C++实现)_计算机软件及应用_IT/计算机_专业资料。目录 1. 2. ...利用堆栈思想编写多项式算法,通过 void CHukunDlg::OnCalc( )调用算 法函数 ...
c++巧算24点代码_计算机软件及应用_IT/计算机_专业资料。#include&iostream.h&...自己编写的算24点c++程序... 6页 免费 第4讲:巧算24点 2页 免费 巧算24...
C++算24点课程论文_工学_高等教育_教育专区。研 究生课 程论文课 程名称授课学期第 C++面向对象程序设计 2013 学年至 一 2014 学年 学期 学专学姓 院业号...
24点游戏程序设计_计算机软件及应用_IT/计算机_专业...() ,根据加 减乘除运算法则,使用 C++ STL 库所...‘)’ :则当该运算符的优先级比运 算符栈顶的...
本文介绍一种算 24 点的程序算法,并给出两个具体的算 24 点的程序。 2.1...计算函数的实现 // C++的函数运算符 operator()可以带任意多个参数,这里带两...
C++24点扑克牌游戏(含源码)_计算机软件及应用_IT/计算机_专业资料。c++编程,24...C++算24点程序 5页 免费
24点游戏程序(C++实现) 19页 2下载券
24点游戏...
课程设计(24点游戏) 30页 免费 24点游戏程序(C++实现) 19页 4下载券 (C++...提取第二次运算的运算符与运算结果和提取第三次运算的运 算符,然后备份没用到...
24点游戏 C++实现_计算机软件及应用_IT/计算机_专业资料。? ? ? 问题:给出 4 个 1-10 的数字,通过加减乘除,得到数字为 24 就算胜利 输入: 4 个 1-10 ...编写程序实现快速计算《24点》这个游戏的*** - 开源中国社区
当前访客身份:游客 [
当前位置:
《24点》这个游戏的规则就是 很多人一起玩都可以,桌面上随意翻出4张牌,大家就利用这4张牌分别进行加减乘除运算,不能重复使用每张牌,谁最快算出结果等于24 就赢。&
在程序的角度来讲,就是4个int类型的数字,然后向编程实现这4个数字进行加减乘除,使其结果等于24。&
输入: 4个数字 & 例如 & 5 & 8 &6 & 3&
输出:这四个数字 的等式 & (6-5)*3*8 =24 &
就这样,可能性有很多个,只要算出一个就输出。
求高手指点算法
共有1个***
for each (char c in buffer)
if (c != '.')
if (record)
formula[i] +=
record=false;
printCurrentNum();
TwentyFourAlgorithm::TwentyFourAlgorithm()
number = new double[ArraySize];
formula = new string[ArraySize];
for (int i = 0; i & ArrayS i++)
number[i] = 0;
printCurrentNum();
TwentyFourAlgorithm::~ TwentyFourAlgorithm()
void TwentyFourAlgorithm::printCurrentNum()
cout && "当前输入数据为:
for (int i = 0; i & ArrayS i++)
cout && number[i] && "
void TwentyFourAlgorithm::printCurrentFormula()
cout && "当前算式为
" && formula[0] &&
bool TwentyFourAlgorithm::IsTwentyFour(int num)
if (num & ArraySize)
cout && "输入数字个数大小越界!" &&
return false;
if (num == 1)
return (abs(number[0] - 24) == ZERO);
for (int i = 0; i & i++)
for (int j = i + 1; j & j++)
double firstNum, secondN
string firstFormula, secondF
firstNum = number[i];
secondNum = number[j];
number[j] = number[num - 1];
firstFormula = formula[i];
secondFormula = formula[j];
formula[j] = formula[num - 1];
formula[i] = "(" + firstFormula + "+" + secondFormula + ")";
number[i] = firstNum + secondN
if (IsTwentyFour(num - 1))
return true;
formula[i] = "(" + firstFormula + "-" + secondFormula + ")";
number[i] = firstNum - secondN
if (IsTwentyFour(num - 1))
return true;
formula[i] = "(" + secondFormula + "-" + firstFormula + ")";
number[i] = secondNum - firstN
if (IsTwentyFour(num - 1))
return true;
formula[i] = "(" + firstFormula + "*" + secondFormula + ")";
number[i] = firstNum * secondN
if (IsTwentyFour(num - 1))
return true;
if (secondNum != 0) {
formula[i] = "(" + firstFormula + "/" + secondFormula + ")";
number[i] = firstNum / secondN
if (IsTwentyFour(num - 1))
return true;
if (firstNum != 0) {
formula[i] = "(" + secondFormula + "/" + firstFormula + ")";
number[i] = secondNum / firstN
if (IsTwentyFour(num - 1))
return true;
number[i] = firstN
number[j] = secondN
formula[i] = firstF
formula[j] = secondF
return false;
简单主程序测试一下
#include"TwentyFourClass.h"
TwentyFourAlgorithm *tfA
void JudgeIsTwentyFour()
if (tfAlgorithm-&IsTwentyFour(4))
cout && "可以组成24点" &&
tfAlgorithm-&printCurrentFormula();
cout && "不可以组成24点" &&
void main()
double demo[] = {1,1,2,12};
tfAlgorithm = new TwentyFourAlgorithm(demo);
JudgeIsTwentyFour();
最后附上下载项目链接:
这个本身的难度并不大,如果有可能的话下次做个24点的网络游戏玩玩吧,嘿嘿嘿。。。。。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:19428次
排名:千里之外
原创:10篇
译文:15篇
(1)(1)(1)(1)(2)(18)(1)24点游戏下载_游戏编程类源码_VC/C++
当前位置 &
运行环境:Windows/Linux
软件大小:222KB
发布日期:.5776
人气浏览:12507
上海网通FTP下载
上海电信HTTP下载
下载此源码的会员还关注过:
简单计算器原代码 ..导弹发射演示..dos软件exe2bin的c源程序代码..如何在按纽上播放avi动画 vc源码..显示地图 缩放漫游..
站长工具:
实用工具:
Copyright &
all rights reserved你的位置: >
> 求解二十四点的所有解 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]);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}&&&&}}
转载请注明: &
与本文相关的文章

参考资料

 

随机推荐