24点游戏 计算机编程,关于24点游戏的编程思路与基本算法
24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性,包括括号的算法。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,其中算术符号有+,-,*,/,。其中有效的表达式有a,ab-cd,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量,比如用1表示+,2表示-等。如下是我对穷举法的一种编程语言。在编程的头部要对变量做下定义。其中a,b,c,d的范围是1到10。这就需要在定义变量的时候要有限制。在vc++中的编程中,在定义控件的变量范围可以直接填写变量的最大和最小,在此编程中的最大是10,最小是1。这就给编程写语句带来了方便。
运用C/C++语言开发工具Microsoft Visual C++ 6.0,利用它简单、明了的开发特点对课本知识进行系统的实践,并且通过对各个知识点的运用进行所需的程序编写。首先,要充分理解每个程序涉及的算法,牢记实现算法的每一个步骤;其次,再在计算机上利用C语言编写出代码,要求结构清晰,一目了然;最后,要对程序进行优化,使程序实现优秀的运行功能。在编写程序的过程中要充分理解并能熟练使用对应的算法,竟可能多的涉及课本中的知识点。总之通过实行整体方案,最终使程序达到运行状态,并且实现良好的运行效果。
故做了如下的计划安排,将这项工程分为两大部分:程序的设计和程序的调试。
首先在程序的设计部分由分为几个步骤:第一步:查阅有关归并排序算法的资料。第二步:设计这个项目的整体架构和算法。第三步:选择一门程序设计语言进行算法的描述。其次,进行程序的调试。
设计方法和内容
在做某件事时,一个好的方法往往能起到事半功倍的效果。在这个课程的设计上,我选择了C++语言作为算法的描述语言,因为C++语言具有丰富的表达能力以及代码的高效性,并且有着良好的移植性和灵活性。同时,采用“自顶向下,个个击破”的程序设计思路和思想,充分运用C++语言强大的功能。使该课程设计做起来更加的简单。
我将这个课程设计整体分成了两个部分。一个是数据结构定义部分和算法部分。这两大部分有机的结合共同构成了该课程设计的程序,运行该程序就可以将该课程设计的功能实现了。
程序的设计思想和内容
(一)算法一:
24点游戏的算法,其中最主要的思想就是穷举法。所谓穷举法就是列出4个数字加减乘除的各种可能性。我们可以将表达式分成以下几种:首先我们将4个数设为a,b,c,d,,将其排序列出四个数的所有排序序列组合(共有A44=24种组合)。再进行符号的排列表达式,其中算术符号有+,—,*,/,(,)。其中有效的表达式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表达式。其中我们用枚举类型将符号定义成数字常量。如下是我对穷举法的一种编程语言。在编程的头部要对变量做下定义。其中a,b,c,d的范围是1到10。这就需要在定义变量的时候要有限制。在vc++中的MFC编程中,在定义控件的变量范围可以直接填写变量的最大和最小,在此编程中的最大是10,最小是1。这就给编程写语句带来了方便(因为其自动会生成语句)。下面我介绍下穷举法的主要实现,我们知道要实现24点的算法,就是通过4个数字,4个运算符号和2对括号(最多为2对),通过各种组合判断其结果是否为24。我们用a,b,c,d代替4个数字。考虑每种可能,总的算法就有7种可能。分别为:
1没括号的(形如a*b*c*d);
2有括号的(形如(a * b) * c * d);
3有括号的(形如(a * b * c) * d);
4有括号的(形如a * (b * c) * d);
5有括号的(形如(a * b) * (c * d));
6有括号的(形如((a * b) * c) * d);
7有括号的(形如(a * (b * c)) * d)。
接下来就是对每一种进行分析判断。
以上就是穷举法的基本实现算法
首先穷举的可行性问题。我把表达式如下分成三类:
1、 列出四个数的所有排序序列组合(共有A44=24种组合)。
2、 构筑一个函数,列出所有运算表达式。
3、 输入数据计算。
(二)算法二:
24点游戏的算法,还有另外一种算法。
把多元运算转化为两元运算,先从四个数中取出两个数进行运算,然后把运算结果和第三个数进行运算,再把结果与第四个数进行运算。在求表达式的过程中,最难处理的就是对括号的处理,而这种思路很好的避免了对括号的处理。基于这种思路的一种算法:
因为能使用的4种运算符 – * / 都是2元运算符,所以本文中只考虑2元运算符。2元运算符接收两个参数,输出计算结果,输出的结果参与后续的计算。
由上所述,构造所有可能的表达式的算法如下:
(1) 将4个整数放入数组中
(2) 在数组中取两个数字的排列,共有 P(4,2) 种排列。对每一个排列,
(2.1) 对 – * / 每一个运算符,
(2.1.1) 根据此排列的两个数字和运算符,计算结果
(2.1.2) 改表数组:将此排列的两个数字从数组中去除掉,将 2.1.1 计算的结果放入数组中
(2.1.3) 对新的数组,重复步骤 2
(2.1.4) 恢复数组:将此排列的两个数字加入数组中,将 2.1.1 计算的结果从数组中去除掉
可见这是一个递归过程。步骤 2 就是递归函数。当数组中只剩下一个数字的时候,这就是表达式的最终结果,此时递归结束。
在程序中,一定要注意递归的现场保护和恢复,也就是递归调用之前与之后,现场状态应该保持一致。在上述算法中,递归现场就是指数组,2.1.2 改变数组以进行下一层递归调用,2.1.3 则恢复数组,以确保当前递归调用获得下一个正确的排列。
括号 () 的作用只是改变运算符的优先级,也就是运算符的计算顺序。所以在以上算法中,无需考虑括号。括号只是在输出时需加以考虑。
void Find(int n) {
if (n == 1) {
if ( fabs(number[0] - VOLUE) <= LING ) //对于除法,要小心小数的精确位数
{ cout << exp[0] << "\t\t";
m_judge = true;
count ++;
if((count % 3)==0) //使输出时每行三个表达式
cout<
}
else
{ }
}
for(int i=0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
double a, b;
string expa, expb;
a = number[i];
b = number[j];
number[j] = number[n - 1]; //递归之后,n比以前小一位,所以可以不停向前赋值
expa = exp[i];
expb = exp[j];
exp[j] = exp[n - 1]; //递归之后,n比以前小一位,所以可以不停向前赋值
exp[i]= '('+ expa + '+' + expb + ')'; //加法不需要分顺序
number[i] = a + b;
Find(n-1);
exp[i]='('+ expa+ '-' + expb + ')'; //减法应该分顺序,减数以及被减数
number[i] = a - b;
Find(n-1);
exp[i] = '('+expb + '-' + expa + ')'; //减法应该分顺序,减数以及被减数
number[i] = b -a;
Find(n-1);
exp[i]= '('+ expa +'*'+ expb+ ')'; //乘法不需要分顺序
number[i]=a*b;
Find(n-1);
if (b != 0) {
exp[i] ='('+expa+'/' + expb + ')'; //除法应该分顺序,除数以及被除数
number[i] = a / b;
Find(n-1);
}
if (a != 0) {
exp[i]='('+expb + '/'+ expa + ')'; //除法应该分顺序,除数以及被除数
number[i] = b / a;
Find(n-1);
}
number[i] =a; //这4句语句是为了防止如果上面几种可能都失败了的话,
number[j]=b; //就把原来的赋值撤消回去,以无干扰的正确的进入到下一次
exp[i] = expa; //for循环队列中。
exp[j] = expb; //
}
}
}
附录A 原程序代码
算法一:
#include
using namespace std;
int main()
{ float a,b,c,d;
m_ret: //做标记
cout<
cout<
cin>>a;
cout<
cin>>b;
cout<
cin>>c;
cout<
cin>>d;
cout<
if ((a<0)||(a>10)||(b<0)||(b>10)||(c<0)||(c>10)||(d<0)||(d>10))
{ cout<
goto m_ret; } // 返回标记,重复输入
int Calculate ( float x, float y, float z, float w); // a .b.c.d 的所有排列组合情况
Calculate(a,b,c,d); Calculate(a,b,d,c); Calculate(a,c,d,b);
Calculate(a,c,b,d); Calculate(a,d,b,c); Calculate(a,d,c,b);
Calculate(b,a,c,d); Calculate(b,a,d,c); Calculate(b,c,a,d);
Calculate(b,c,d,a); Calculate(b,d,c,a); Calculate(b,d,a,c);
Calculate(c,a,b,d); Calculate(c,a,d,b); Calculate(c,b,d,a);
Calculate(c,b,a,d); Calculate(c,d,a,b); Calculate(c,d,b,a);
Calculate(d,a,b,c); Calculate(d,a,c,b); Calculate(d,b,c,a);
Calculate(d,b,a,c); Calculate(d,c,a,b); Calculate(d,c,b,a);
return 0; }
int Calculate ( float x, float y, float z, float w) //运算表达式的所有情况
{
if (x+y+z+w==24) cout<
else if (x+y+z-w==24) cout<
else if ((x+y)*(z+w)==24) cout<
else if ((x-y)*(z+w)==24) cout<
else if ((x-y)*(z-w)==24) cout<
else if ((x+y+z)*w==24) cout<
else if ((x-y-z)*w==24) cout<
else if ((x+y-z)*w==24) cout<
else if ((x*y*z)/w==24) cout<
else if ((x*y)*(z+w)==24) cout<
else if ((x*y)*(z-w)==24) cout<
else if ((x*y)*z-w==24) cout<
else if ((x*y)*z+w==24) cout<
else if (x*y*z*w==24) cout<
else if ((x+y)+(z/w)==24) cout<
else if ((x+y)*(z/w)==24) cout<
else if ((x*y)+z+w==24) cout<
else if ((x*y)+z-w==24) cout<
else if ((x*y)-(z/w)==24) cout<
else if ((x*y)+(z/w)==24) cout<
else if ((x*y)-z-w==24) cout<
else if ((x*y)+(z*w)==24) cout<
else if ((x*y)-(z*w)==24) cout<
else if ((x*y)/(z*w)==24) cout<
else if ((x*y)/(z-w)==24) cout<
else if ((x*y)/(z+w)==24) cout<
else cout<
return 0;
}
算法二:
#include
#include
#include
using namespace std;
const double LING = 1E-6;
const int CONT = 4;
const int VOLUE = 24;
double number[CONT];
string expression[CONT];
bool m_judge = false; //判断是否有解。
int count = 0;
void Find(int n)
{
if (n == 1)
{
if ( fabs(number[0] - VOLUE) <= LING )
{
cout << expression[0] << "\t\t";
m_judge = true;
count ++;
if((count % 3)==0) //使输出时每行三个表达式
cout<
}
else
{ }
}
for(int i=0; i < n; i++)//查找
{
for (int j = i + 1; j < n; j++)//与其后面的查找进行计算
{
double a, b;
string expressiona, expressionb;
a = number[i];
b = number[j];
number[j] = number[n - 1];
expressiona = expression[i];
expressionb = expression[j];
expression[j] = expression[n - 1];
expression[i]= '('+ expressiona + '+' + expressionb + ')';
number[i] = a + b;
Find(n-1);
expression[i]='('+ expressiona+ '-' + expressionb + ')';
number[i] = a - b;
Find(n-1);
expression[i] = '('+expressionb + '-' + expressiona + ')';
number[i] = b -a;
Find(n-1);
expression[i]= '('+ expressiona +'*'+ expressionb+ ')';
number[i]=a*b;
Find(n-1);
if (b != 0)
{
expression[i] ='('+expressiona+'/' + expressionb + ')';
number[i] = a / b;
Find(n-1);
}
if (a != 0)
{
expression[i]='('+expressionb + '/'+ expressiona + ')';
number[i] = b / a;
Find(n-1);
}
number[i] =a;
number[j]=b;
expression[i] = expressiona;
expression[j] = expressionb;
}
}
}
int main()
{
cout<
for (int i = 0; i < CONT; i++)
{
char ch[20];
cout<
cin >>number[i];
itoa(number[i],ch, 10); //itoa()函数的作用是把第一个参数(数值)传送(转换)到第二个参数(字符串)中去,第三个参数(int型)是该数值在字符串里以什么进制存放。
expression[i] = ch;
}
cout<
Find(CONT) ;
if(m_judge==true)
{
cout << "\n成功!" << endl;
cout<
}
else
{
cout << "失败!" << endl;
}
return 0;
}
24点游戏 计算机编程,关于24点游戏的编程思路与基本算法相关推荐
- 科学计算机怎么玩游戏,计算机也能玩文本游戏
计算机也能玩文本游戏 已具备自主探究词义的能力 2015-10-10科技日报 刘岁晗 [字体:大 中 小] 语音播报 美国麻省理工学院近日设计了一种计算机系统,可在没有任何关于语言是如何运作的预先设定 ...
- 玩纸牌游戏计算机教案,《玩“纸牌”游戏》说课稿—获奖说课稿
<<玩"纸牌"游戏>说课稿-获奖说课稿.doc>由会员分享,可免费在线阅读全文,更多与<<玩"纸牌"游戏>说课稿-获奖 ...
- 烧脑打游戏计算机,盘点极度烧脑的游戏有哪些 烧脑解谜游戏推荐
上分.吃鸡时遇到神坑队友时是不是非常绝望呢?恨不得自己有三头六臂能一打五,遇到这种情况不要慌,远离小学生,玩一款高智商游戏冷静一下.下面就给大家推荐几款极度烧脑的游戏,小学生是玩不来这些游戏的. 烧脑 ...
- 创编游戏计算机课反思,大班音乐游戏教案及教学反思《包饺子》
设计背景 某天,我就本班近期有好些小朋友挑食的情况,和小朋友进行了一次谈话课:我喜欢吃的蔬菜.在谈话过程中,有个小朋友说他喜欢吃饺子里的蔬菜,喜欢看饺子在锅里翻滚着,并一边很形象的模仿着翻滚的动作.瞬 ...
- 玩游戏计算机丢失msvcp,电脑玩游戏提示“msvcp120.dll丢失”的解决方法
我们在电脑上玩游戏经常提示"无法启动程序,因为计算机中丢失msvcp120.dll.尝试重新安装该程序以解决此问题",导致游戏无法正常运行,这应该如何如何解决?为此,小编就来和大家 ...
- 玩游戏计算机虚拟内存怎么设置,玩游戏时提示虚拟内存太小怎么办
小编这里要跟大家分享的是关于玩游戏时提示虚拟内存太小的解决方法,游戏是如今很多人在业余时间用来消遣和放松的方式,电脑运行顺畅是玩游戏必备的条件之一,否则就会很扫兴,但是一些用户反映,好不容易想要玩一把 ...
- 玩纸牌游戏计算机教案,大班科学纸牌游戏教案
教案一:好玩的扑克 活动目标: 1.尝试用多种方法让扑克牌站立起来,感知力与平衡的关系. 2.学习记录实验结果并乐于大胆明确的表达自己的想法. 3.在探索扑克的多种玩法中锻炼求异思维,乐于合作探究. ...
- 3d游戏计算机怎么配置要求吗,游戏设计专业需要怎样的电脑配置?
中端的 cpu:E3 1230 V3:主板:技嘉B85 内存:8G:显卡:GTX760(影驰或者索泰) 电源:航嘉额定450W功率:在算上机箱+散热器大概4500左右. 高端的 CPU:i7 4790 ...
- 吃鸡游戏计算机配置,畅玩主流游戏吃鸡LOL组装电脑配置清单
上个月intel发布了十代系列处理器,十代酷睿系列处理器的核心线程规格整体提升,其中i3 10100的规格来到了4核8线程(九代i3是4核4线程).下面就为大家带来一套i3 10100的电脑配置清单, ...
- 游戏计算机推荐,2020十大游戏笔记本电脑排名(最新游戏本推荐)
2020十大游戏笔记本电脑排名(最新游戏本推荐) 1.玩家国度冰刃3S(9代i7+RTX2070,240Hz超高刷新率电竞屏) 2.外星人Alienware M15(银\红双色可选,144Hz 108 ...
最新文章
- COCO KeyPoints关键点数据集准备
- python全栈脱产第25天------组合、多态、封装、property装饰器
- js正则表达式语法大全_一条正则表达式闹的乌龙
- 苹果6s解除耳机模式_出大问题!苹果或将砍掉3D Touch?
- 最常用的设计模式---适配器模式(C++实现)
- UI设计素材之按钮和选框,悠闲素材帮你轻松搞定设计。
- azure上传代码_深入了解Azure Data Studio:更多代码和更少GUI
- 一文看懂全排列算法!
- java分布式缓存memcached_分布式缓存系统Memcached学习心得
- Hibernate3动态条件查询
- php大文件去重,详细解说PHP多个进程配合redis的有序集合实现大文件去重
- matlab工程热力学大程序,西安交通大学工程期末编程大作业(完整版
- mysql中%3c%3e和=_如何巧妙去除隐藏“站长统计”文字链接?
- 微信内置浏览器直接下载APP的解决方法
- 按摩店用的收银系统多少钱一套
- 微服务架构总结性介绍 (深度好文)
- css3 画太极图——用一个div实现
- PostgreSQL JIT(Just-In-Time Compilation)With LLVM 的实现原理
- python控制ppt翻页_详解Python操作PPT的各种骚操作!
- cpp c++编写代码块 有颜色 好看些