24点游戏算法 C/C++ 求解释,要汉语注释!!!!越详细越好!!!!!!!!!

如题所述

/******************************************************************************
分治递归
首先从集合A中任意取出两个数,如取出1和2,A = A - {1, 2},对取出来的数分别进行
不同的四则运算,1+2=3,1-2=-1,1/2 = 0.5,1×2 = 2,将所得的结果再分别加入集合A,
可得到B = {3, 3, 4},C = {-1, 3, 4},D = {0.5, 3, 4},E = {2, 3, 4}四个新的集合,
那么f(A)= f(B)+ f(C)+ f(D)+ f(E),通过以上的计算就达到了分而治之的目的,
问题规模就从4个数降到了3个数,成了3个数的4个子问题之和。
综上所述,可以得到递归解法:
******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

#define PRECISION 0.000001
#define COUNT 4
#define RESULT 24
#define LENGTH 20

double number[COUNT]; //这里一定要用double,看看第一题的答案就知道为什么了
char *expression[COUNT]; //保存表达式

void combine(char *exp, char *exp1, char *exp2, char *op); //连接字符串
int test(int n);

void combine(char *exp, char *exp1, char *exp2, char *op)
{
strcpy(exp, "(");
strcat(exp, exp1);
strcat(exp, op);
strcat(exp, exp2);
strcat(exp, ")");
}

int test(int n)
{
int i, j;
double a, b;
char expa[LENGTH], expb[LENGTH];

if(n==1) //递归结束
{
if(fabs(number[0] - RESULT) < PRECISION)
{
printf("%s\n", expression[0]);
return 1;
}
else
return 0;
}

//递归过程
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
a = number[i];
b = number[j];

strcpy(expa, expression[i]);
strcpy(expb, expression[j]);
strcpy(expression[j], expression[n-1]);

combine(expression[i], expa, expb, "+");
number[i] = a + b;
number[j] = number[n-1]; //结果放到参加运算的第一个,最后一个放到参加运算的第二个
if(test(n-1) == 1)
return 1;

//减号有两种情况,a-b与b-a
combine(expression[i], expa, expb, "-");
number[i] = a - b;
if(test(n-1) == 1)
return 1;

combine(expression[i], expb, expa, "-");
number[i] = b - a;
if(test(n-1) == 1)
return 1;

combine(expression[i], expa, expb, "*");
number[i] = a * b;
if(test(n-1) == 1)
return 1;

//除法也有两种情况,a/b与b/a
if( b != 0 )
{
combine(expression[i], expa, expb, "/");
number[i] = a / b;
if(test(n-1) == 1)
return 1;
}

if( a!=0 )
{
combine(expression[i], expb, expa, "/");
number[i] = b / a;
if(test(n-1) == 1)
return 1;
}

//恢复数组
number[i] = a;
number[j] = b;
strcpy(expression[i], expa);
strcpy(expression[j], expb);
}
}
return 0;
}

void main()
{

int i;
int num;
char buffer[COUNT][LENGTH];

printf("请输入4个数:\n");
for(i=0; i<COUNT; i++)
{
scanf("%d", &num);
number[i] = num;
_itoa(num, buffer[i], 10);
expression[i] = buffer[i];
}

if(test(COUNT) == 0)
printf("无解。\n");
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-04-10
#include <iostream>
#include <time.h>
using namespace std;

const int size=9;
class guess
{
public:
void randnum();
void cutnumguess(int);
void done();
bool guessn;
int a;
int b;
private:
int rslt[4];
int guessnum[4];
}game;

void guess::randnum()
{
rslt[0]=rand()%size;
do
rslt[1]=rand()%size;
while(rslt[1]==rslt[0]);
do
rslt[2]=rand()%size;
while(rslt[2]==rslt[0]||rslt[2]==rslt[1]);
do
rslt[3]=rand()%size;
while(rslt[3]==rslt[0]||rslt[3]==rslt[1]||rslt[3]==rslt[2]);
}

void guess::cutnumguess(int n)
{
guessnum[0]=n/1000;
guessnum[1]=n/100-10*guessnum[0];
guessnum[3]=n%10;
guessnum[2]=(n%100-guessnum[3])/10;
guessn=true;
int i,j;
for(i=0;i<3;i++)
for(j=i+1;j<4;j++)
{
if(guessnum[i]==guessnum[j])
{
guessn=false;
break;
}
if(guessn)
;
else
break;
}
}

void guess::done()
{
a=0;
b=0;
int i,j;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(i==j&&guessnum[i]==rslt[j])
a++;
if(i!=j&&guessnum[i]==rslt[j])
b++;
}
}

void main()
{
char gameexit;
int chance,n;
do
{
chance=10;
game.randnum();
do
{
cout<<"你还有"<<chance<<"次机会"<<endl<<"请输入你要猜的数字";
cin>>n;
game.cutnumguess(n);
while(!game.guessn||n>9999||n<0)
{
cout<<"数字输入错误,请重新输入"<<endl<<"你还有"<<chance<<"次机会"<<endl
<<"请输入你要猜的数字";
cin>>n;
game.cutnumguess(n);
}
game.done();
if(game.a==4)
{
cout<<"你赢了!!!"<<endl<<"按[x]键退出,其他键继续";
cin>>gameexit;
break;
}
else
{
cout<<n<<" "<<game.a<<"A"<<game.b<<"B"<<endl;
}
chance--;
}while(chance!=0);
if(chance==0)
{
cout<<"你输了!!!"<<endl<<"按[x]键退出,其他键继续";
cin>>gameexit;
}
}while(gameexit != 'x');
cout<<"感谢您的使用,再见!"<<endl;
}本回答被网友采纳
第2个回答  2011-04-10
我说···这个在MSDN里面有的追问

我没找到啊!

追答

····这个你自己你自己猜吧反正就是那点作用··

24点游戏算法 C\/C++ 求解释,要汉语注释!!!越详细越好!!!
不同的四则运算,1+2=3,1-2=-1,1\/2 = 0.5,1×2 = 2,将所得的结果再分别加入集合A,可得到B = {3, 3, 4},C = {-1, 3, 4},D = {0.5, 3, 4},E = {2, 3, 4}四个新的集合,那么f(A)= f(B)+ f(C)+ f(D)+ f(E),通过以上的计算就达到了...

如何利用C++程序编写24点游戏(有要求)
int method;\/*方法的代号,记下由这四个数字得到24的一种方法(有可能有多种得到24的方法,但只选最先找到的那种方法)*\/public: Four(int a=0,int b=0,int c=0,int d=0,int m=0,int s1=0,int s2=0,int s3=0);\/*构造函数,初始化成员数据*\/ void reSet(int a,int b,int c,int d,int m,...

24点的算法 C++
\/* k[] c[]种四张牌的代号,其中k[I]=I+1。 用它来代替c[]做处理,考虑到c[]中有可能出现相同数的情况 *\/ \/* kans[] 暂存生成的排列组合 *\/ \/* j 嵌套循环的次数 *\/ int fans(c,k,ans,kans,j) int j,k[],c[];char ans[],kans[]; { int i,p,q,r,h,flag,s[4],t[4][4]; ...

求教24点游戏的算法(最好用C++)
用循环的嵌套生成a,b,c,d的24种全排列,记录在数组中.把每一组数当作一个四位的14进制数,把这24个数全部转化为十进制(如(6529)14=6*143+5*142+2*14+9).这样,如果两个排列完全相同,则得到的十进制数是相等的.这样,通过对这些十进制的比较,就可以比较这些排列的相同情况.一旦遇到相同的排列,就标记上....

利用c++ 解决 24点 题目。请高手们帮忙!!谢谢
没明白你的意思。

C或C++高手进从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这...
从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这怎么做,最好能给出程序和说下算法核心思想... 从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这怎么做,最好能给出程序和说下算法核心思想 展开  我来答 5个回答 #热议# 职场上受委屈要不要为自己解释?百度网友b0e28cae4 ...

C语言基础知识总结大全
《C陷阱与缺陷》 正如书上所说,“本书所揭示的知识,至少能够帮助你减少 C 代码和初级 C++ 代码中 90% 的 Bug”,看完后可以避免 C 语言开发的一些坑。 网课 1、《郝斌C语言自学教程》 2、《程序设计入门——C语言》(浙大翁恺) 小项目 包括C语言迷宫、24点游戏、奔跑的火柴人、超市管理系统、打字母、电子...

相似回答
大家正在搜