c++ 算24点 求助

#include<iostream>
using namespace std;
void f(int p)
{ if(p==0) cout<<'+';
if(p==1) cout<<'-';
if(p==2) cout<<'*';
if(p==3) cout<<'/';
}
void math(int o,int b,int c,int d)
{ int pa1,pa2,pa3,a[4];
a[0]=o;a[1]=b;a[2]=c;a[3]=d;
for(int i=0;i<4;i++)
for(int j=0;j<4&&j!=i;j++)
for(int k=0;k<4&&k!=i&&k!=j;k++)
for(int t=0;t<4&&t!=i&&t!=j&&t!=k;t++)
{ cout<<a[i]<<a[j]<<a[k]<<a[t];
for(int q=0;q<4;q++)
{ if( q==0) pa1=a[i]+a[j];
else if(q==1)pa1=a[i]-a[j];
else if(q==2) pa1=a[i]*a[j];
else if(q==3)pa1=a[i]/a[j];
for(int w=0;w<4;w++)
{ if(w==0) pa2=pa1+a[k];
else if(w==1) pa2=pa1-a[k];
else if(w==2) pa2=pa1*a[k];
else if(w==3) pa2=pa1/a[k];
for(int e=0;e<4;e++)
{ if(e==0) pa3=pa2+a[t];
else if(e==1)pa3=pa2-a[t];
else if(e==2) pa3=pa2*a[t];
else if(e==3)pa3=pa2/a[t];
if (pa3==24)
{ cout<<"((("<<a[i];f(q);
cout<<a[j]<<')';f(w);
cout<<a[k]<<')';f(e);
cout<<a[t]<<')'<<endl;}
}
}
}

}
}
void main()
{ int a,b,c,d;
// cin>>a>>b>>c>>d;
math(0,1,2,3);
}

帮我看看哪里出问题 就是这个思路 不需要其他算法的 谢谢
问题补充:前4个for 就是排列a【0】-a【3】不重复 一堆if就是改变4个数中间的3个符号 最后的显示应是 (((a【i】…… a【j】)……a【k】)……a【t】)=24 省略号处是+-*/符号

第1个回答  2008-08-11
我编写了一个和你思路一样的程序,也许可以对你有帮助。
不过测试后,我发现其实这个思路有一个非常大的问题,它无法计算(3*4)+(3*4)=24 -_-
or 240/(9+2/2)这样的困难的24点问题,还望你仔细思考一下,换换思路。
#include<iostream>
using namespace std;

int main(){
int i1,i2,i3,i4,v,n1,n2;
int num=0;
int a,b;
double t1,t2,t3,t4,choice[4],s1[4],s2[4][4],t;
for(;;){
cout<<"########################## 二十四点 ###################################\n友情提示:A=1,J=11,Q=12,K=13\n";
cout<<"请给出你抽到的第一牌:";
cin>>choice[0];
cout<<"请给出你抽到的第二牌:";
cin>>choice[1];
cout<<"请给出你抽到的第三牌:";
cin>>choice[2];
cout<<"请给出你抽到的第四牌:";
cin>>choice[3];
cout<<"########################## THINKING ###################################\n";

for(b=0;b<=2;b++)
for(a=3;a>=1+b;a--)if(choice[a]<choice[a-1]){
t=choice[a-1];
choice[a-1]=choice[a];
choice[a]=t;}

for(int j=0;j<4;j++)cout<<j+1<<". "<<choice[j]<<" ";
cout<<"\n";

for(i1=0;i1<4;i1++){
t1=choice[i1];
for(i2=0;i2<4;i2++){ if((i1-1)!=0 && t1==choice[i1-1])break;
if(i2!=i1){
t2=choice[i2];
s1[0]=t1+t2;
s1[1]=t1-t2;
s1[2]=t1*t2;
s1[3]=t1/t2;
for(i3=0;i3<4;i3++){
if(i3!=i1&&i3!=i2){
t3=choice[i3];
for(v=0;v<4;v++)
{s2[v][0]=s1[v]+t3;
s2[v][1]=s1[v]-t3;
s2[v][2]=s1[v]*t3;
s2[v][3]=s1[v]/t3;}
for(i4=0;i4<4;i4++){
if(i4!=i1&&i4!=i2&&i4!=i3){
t4=choice[i4];
for(n1=0;n1<4;n1++)for(n2=0;n2<4;n2++)
if(s2[n1][n2]+t4==24||s2[n1][n2]-t4==24||s2[n1][n2]*t4==24||s2[n1][n2]/t4==24){
cout<<"找到一种组合方案:\n(("<<t1;

if(s1[n1]==t1+t2)cout<<" + ";
if(s1[n1]==t1-t2)cout<<" - ";
if(s1[n1]==t1*t2)cout<<" * ";
if(s1[n1]==t1/t2)cout<<" / ";

if(n2==0)cout<<t2<<") + "<<t3;
if(n2==1)cout<<t2<<") - "<<t3;
if(n2==2)cout<<t2<<") * "<<t3;
if(n2==3)cout<<t2<<") / "<<t3;

if(s2[n1][n2]+t4==24)cout<<") + "<<t4<<" = 24 \n";
if(s2[n1][n2]-t4==24)cout<<") - "<<t4<<" = 24 \n";
if(s2[n1][n2]*t4==24)cout<<") * "<<t4<<" = 24 \n";
if(s2[n1][n2]/t4==24)cout<<") / "<<t4<<" = 24 \n";
num++;
}

}}}
}}}}

cout<<"总共有"<<num<<"种解法。\n";
if(num==0)cout<<"这四张牌无法构成24点~~~\n";
num=0;
}
return 0;
}本回答被提问者采纳
第2个回答  2020-04-03
非常不好做的,这个组合太多了,不好写。
第3个回答  2020-01-08
很简单、深搜
第4个回答  2008-08-10
这是什么啊 我看不懂 是不是大学数学。

求高手用c++解决二十四点的问题,具体如下
对于24点的情况,因为数组A有4个数,因此将其用各种方法拆分即可得到最终的f(A),然后查询其中是否存在元素24即可得到有解或者无解的判断。 需要说明的有几点: 1.这个问题表面上需要采用递归的算法,即如果只有一个元素那么直接返回,否则将问题转化为多个f的计算,而每个f的计算又要经过转化,层层递归,直至只有一个元素...

跪求c++计算24点的程序,要退学啦,求求啦..5555,帮帮小妹
计算24点:任意输入4位自然数,利用+、-、*、\/四则运算使之得到结果24。输出所有不同算法的计算表达式,可为运算优先级而使用括号。注意不要多次输出相同的计算表达式,例如:满足交换... 计算24点:任意输入4位自然数,利用 +、-、*、\/ 四则运算使之得到结果 24 。输出所有不同算法的计算表达式,可为运算优先级而...

c++ 24点
你的第一个for循环里面,sum[i][3]=num[i*2]\/num[i*2+1];都是int型相除,所以极有可能会出现结果为0的状况。然后你再第二个for循环里面,sum_x[3]=sum[0][l] \/ sum[1][k]; 一旦第一个for里面有结果为0,你这里就变成除以0,然后就崩溃了。你试试把所有的数组都改成float或者doub...

c++ 算24点 求助
if(s2[n1][n2]\/t4==24)cout<<") \/ "<<t4<<" = 24 \\n";num++;} }}} }}} cout<<"总共有"<<num<<"种解法。\\n";if(num==0)cout<<"这四张牌无法构成24点~~~\\n";num=0;} return 0;}

C或C++高手进从1到13中任选4个数,运用+,-,*,\/,()使其最后的值为24,这...
算24点的一般形式,用正则表达式表示有一下几种:( ( ( E O E ) O E ) O E ) = 24( ( E O ( E O E ) ) O E ) = 24( ( E O E ) O ( E O E ) ) = 24( ( E O E ) O ( E O E ) ) = 24( E O ( ( E O E ) O E ) ) = 24( E O ( E O ( E O E...

C++算法,求高手解答。对24点算法的简单描述+算法的流程图,以及时间复 ...
2-10 按其点数计算(为了表示方便10用T表示),J,Q,K,A 统一按 1 计算 要求通过加减乘除四则运算得到数字 24。本程序可以随机抽取纸牌,并用试探法求解。\/ int s[21][4]={-1};int sum=0;void GivePuzzle(char* buf){ char card[] = {'A','2','3','4','5','6','7','8',...

求教24点游戏的算法(最好用C++)
24点游戏是一个大众化的益智游戏.任意给四张扑克牌(不包括大小王),只能够用加,减,乘,除以及适当的括号连接这四张牌,无论顺序,使计算结果为24,或者宣布根本就是无解的.需要注意的是,每张牌必须运算,并且只能运算一次,J,Q,K可设置为11,12,13.本程序目的就是算出一组牌的所有解(不同形式的式子算不同解),...

求24点游戏的算法,VC++
以下是c++(win32工程)的代码,你看一下对不对 include <iostream> include 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()...

如何利用C++程序编写24点游戏(有要求)
若输入不能运算出24的数据,如1,1,1,1,则显示经过加、减、乘、除运算后,运行结果不能得到24。其它要求: (1)使用C++语言,源程序要有适当的注释,使程序容易阅读(2) 至少采用文本菜单界面 (3) 学生可自动增加新功能模块(视情况可另外加分)(4) 写出课程设计报告,具体要求见相关说明文档提示:1. 程序采用穷举法...

24点游戏算法 C\/C++ 求解释,要汉语注释!!!越详细越好!!!
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, cha...

相似回答