if(n==0)return1;
return_________f(m,n-1)+f(m-1,n)______________;
}
最后一题:
编程题:
注:
最后一题的编程题对参赛者的要求相当高,以下代码在你提交自己的程序设计思路前是不可见的。
求二十四点:
//Calcu24.cpp:
Definestheentrypointfortheconsoleapplication.
//
#include“stdafx.h”
#include“conio.h”
#include“stdlib.h”
#include“time.h”
#include“math.h”
#include“string.h”
/*
从一副扑克牌中,任取4张。
2-10按其点数计算(为了表示方便10用T表示),J,Q,K,A统一按1计算
要求通过加减乘除四则运算得到数字24。
本程序可以随机抽取纸牌,并用试探法求解。
*/
voidGivePuzzle(char*buf)
{
charcard[]={‘A’,’2′,’3′,’4′,’5′,’6′,’7′,’8′,’9′,’T',’J',’Q',’K'};
for(inti=0;i<4;i++){
buf=card[rand()%13];
}
}
voidshuffle(char*buf)
{
for(inti=0;i<5;i++){
intk=rand()%4;
chart=buf[k];
buf[k]=buf[0];
buf[0]=t;
}
}
intGetCardValue(intc)
{
if(c==’T') return10;
if(c>=’0′&&c<=’9′)returnc–’0′;
return1;
}
charGetOper(intn)
{
switch(n)
{
case0:
return‘+’;
case1:
return‘-’;
case2:
return‘*’;
case3:
return‘/’;
}
return‘‘;
}
doubleMyCalcu(doubleop1,doubleop2,intoper)
{
switch(oper)
{
case0:
returnop1+op2;
case1:
returnop1–op2;
case2:
returnop1*op2;
case3:
if(fabs(op2)>0.0001)
returnop1/op2;
else
return100000;
}
return0;
}
voidMakeAnswer(char*answer,inttype,char*question,int*oper)
{
charp[4][3];
for(inti=0;i<4;i++)
{
if(question==‘T’)
strcpy(p,“10″);
else
sprintf(p,“%c”,question);
}
switch(type)
{
case0:
sprintf(answer,“%s%c(%s%c(%s%c%s))”,
p[0],GetOper(oper[0]),p[1],GetOper(oper[1]),p[2],GetOper(oper[2]),p[3]);
break;
case1:
sprintf(answer,“%s%c((%s%c%s)%c%s)”,
p[0],GetOper(oper[0]),p[1],GetOper(oper[1]),p[2],GetOper(oper[2]),p[3]);
break;
case2:
sprintf(answer,“(%s%c%s)%c(%s%c%s)”,
p[0],GetOper(oper[0]),p[1],GetOper(oper[1]),p[2],GetOper(oper[2]),p[3]);
break;
case3:
sprintf(answer,“((%s%c%s)%c%s)%c%s”,
p[0],GetOper(oper[0]),p[1],GetOper(oper[1]),p[2],GetOper(oper[2]),p[3]);
break;
case4:
sprintf(answer,“(%s%c(%s%c%s))%c%s”,
p[0],GetOper(oper[0]),p[1],GetOper(oper[1]),p[2],GetOper(oper[2]),p[3]);
break;
}
}
boolTestResolve(char*question,int*oper,char*answer)
{
//等待考生完成
}
returntrue;
//returnfalse;
}
/*
采用随机试探法:
就是通过随机数字产生加减乘除的组合,通过大量的测试来命中的解法
提示:
1.需要考虑用括号控制计算次序的问题比如:
(10–4)*(3+A),实际上计算次序的数目是有限的:
A*(B*(c*D))
A*((B*C)*D)
(A*B)*(C*D)
((A*B)*C)*D
(A*(B*C))*D
2.需要考虑计算结果为分数的情况:
(3+(3/7))*7
3.题目中牌的位置可以任意交换
*/
boolTryResolve(char*question,char*answer)
{
intoper[3]; //存储运算符,0:
加法1:
减法2:
乘法3:
除法
for(inti=0;i<1000*1000;i++)
{
//打乱纸牌顺序
shuffle(question);
//随机产生运算符
for(intj=0;j<3;j++)
oper[j]=rand()%4;
if(TestResolve(question,oper,answer)) returntrue;
}
returnfalse;
}
intmain(intargc,char*argv[])
{
//初始化随机种子
srand((unsigned)time(NULL));
charbuf1[4]; //题目
charbuf2[30]; //解答
printf(“***************************\n”);
printf(“计算24\n”);
printf(“AJQK均按1计算,其它按牌点计算\n”);
printf(“目标是:
通过四则运算组合出结果:
24\n”);
printf(“***************************\n\n”);
for(;;)
{
GivePuzzle(buf1); //出题
printf(“题目:
”);
for(intj=0;j<4;j++){
if(buf1[j]==‘T’)//、、、、初始化buf1[];
printf(“10“);
else
printf(“%c“,buf1[j]);
}
printf(“\n按任意键参考答案…\n”);
getch();
if(TryResolve(buf1,buf2)) //解题
{
// //printf(“a\n”);
//for(inti=0;i<17;i++)
// printf(“%c”,buf2);
printf(“参考:
%s\n”,buf2);
}
else
printf(“可能是无解…\n”);
printf(“按任意键出下一题目,x键退出…\n”);
if(getch()==‘x’)break;
}
return0;
}