/******************************************************************************
分治递归
首先从集合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");
}
温馨提示:内容为网友见解,仅供参考
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点游戏、奔跑的火柴人、超市管理系统、打字母、电子...