计算24游戏课程设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
游戏24点设计
1.算法描述(源代码里有更详尽解释):
主要方法:
遍历与递归。
2. 主要思路:
把输入的四个数放在一个数组n[4]中,然后任取其中任意两个(不能取同一个--既不能出现自己和自己运算的情况),然后用一个for和一个switch语句来实现这两个数的加减乘除运算,然后把运算的结果放到另一个数组b[4]中并记录此运算的表达式(放到一个大一点的数组tm[4][25]中),同时把其他两个没用到的数也放到该数组中,然后重复以上过程(用遍历实现),最后先判定是不是最后一层运算,是的话在判定最后结果是不是等于24,等于24的话就把那个纪录运算式的数组输出。然后考虑到不能出现重复的(例如:1*2*3*4和2*4*3*1等等)我在遍历的同时记录了第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,对输出的时候做限定(例如:对运算符全*的只输出一遍等等)。在有一次输出后我还定义了另外两个数组用来分别保存上一次输出的第一次运算的结果,第一次运算的运算符,第二次运算的结果,第二次运算的运算符和第三次运算的运算符,来解决重复输出的问题,不过此种做法有可能导致输出的时候不全。(此问题尚未解决)即还不能同时保证全面性与不重复性。
3. 主要函数与数组:
主要有两个函数,一个主函数,用来输入四个数,并且完成初始化。还有一个count(float a[],char tem[][25],int n)函数,用来完成遍历,递归,与输出,其中a[]中存放要输入的4个数,tem[][25]中放计算步骤,n是a[]中元素的个数。在函数体内还定义了b[4]和tm[4][25]用来完成递归,函数一开始先判定输出条件(是否是第三次运算,结果是否等于24),如果不满足条件就做遍历与递归,遍历用了3个for循环和1个switch语句来完成,然后为递归准备数据,用sprintf函数将运算式输出到数祖tm[]中,在输入运算式的同时把括号输到tm[]中,然后提取第一次运算的运算符与运算结果,提取第二次运算的运算符与运算结果和提取第三次运算的运算符,然后备份没用到的数据(为递归之用)。接下来进行递归重复上述过程。4. 算法流程图:(简化的流程图,源代码里有更详尽解释)
主函数流程图
其中k是全局变量用来Array
判定算法是否有解
count(函数流程图
5.源代码及其分析
#include
#include
#include
#include
#include
#include
#define MAX 4;//最大输入个数。
int k=0;//全局变量用来判定是否有解
char tp[4]={0,0,0,0},tpt[2000]={0},tptt[2000]={0},tre[2000]={0};//用来消除重复。tp[1-3]用来记录运算式中的3个运算符。
char op[4]={'+','*','-','/'};
void count(float a[],char tem[][25],int n);//a[]中存放要输入的4个数,tem[][25]中放计算步骤,n是a[]中元素的个数。
int q=0,p=0,e=0,w=0,t=0,r=0,g=0,h=0,v=0,u=0,tu=0,te=0;//用于消除重复。
float group[2]={0,0},flow[20]={0},flo[20]={0};//
//tem[][25]中放计算步骤,n是a[]中元素的个数。
void main()
{
char br=1;
int d;
while (br==1)
{ float number[4];//放四个数。
char temp[4][25]; //放运算式,初始化放四个数。
cout<<"please insert four numbers:";
cout< for(d=0;d<4;d++) cin>>number[d];//输入四个数 for(d=0;d<4;d++) { sprintf(temp[d],"%d",(int) number[d]); }//初始化temp[d]; count(number,temp,4);//调用count函数。 if (k==0) cout<<"no answer"; cout< cout<<"press 0 end"< scanf ("%d",&br); } } void count(float a[],char tem[][25],int n) { float b[4]; char tm[4][25];//b[4]和t[4][]作用同上(为递归之用)。 int i,j,l,x,y;//i,j用来作双循环;l用来作加减乘除的开关;x,y为后面准备递归数据之用。 /************************************************************************************/ //输出部分 if(n==1) { if (fabs(a[0]-24)<0.00001)//因为要考虑除法所以用fabs函数求绝对值与24比较。 //相当于等于24时的情况。 { /************************************************************************************/ //以下是限定输出条件: if(tp[3]=='-'&&tp[2]=='-'&&tp[1]=='*') { if(te==0) { cout<<"\n有解为"< k=1; te=1; } }//对运算符全*的只输出一遍。 else if(tp[3]=='+'&&(tp[2]=='+'||tp[0]=='+')&&tp[1]=='+') { if(t==0) { cout<<"\n有解为"< k=1; t=1; } }//对运算符全+的只输出一遍。 else if(tp[3]=='+'&&(tp[2]=='*'||tp[0]=='*')&&tp[1]=='+') { if(g==0) { cout<<"\n有解为"< k=1; g=1; } } else if((tp[3]=='-'&&tp[2]=='+')||(tp[3]=='+'&&tp[2]=='-')) { if(w==0) { cout<<"\n有解为"< k=1; w=1; } }//对于第二次运算时取到b[0]时,第一第二个运算符是+,-或-,+的只输出一遍。 else if(tp[3]=='+'&&tp[2]=='+')