大家来看一道算法题?

Jans 2001-09-03 10:43:45
有一种扑克牌游戏,任意出四张牌,把上面的数字用加减乘除以及括号等
运算让其结果等于24,A,为1,J,Q,K为11,12,13;编程求出其可能的算
式,如果不可以,报错!
...全文
124 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
野男孩 2001-09-06
  • 打赏
  • 举报
回复
快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!!快给分啊!!!!!!
野男孩 2001-09-05
  • 打赏
  • 举报
回复
仔细看看上面的算法,和括号无关!
有没有注意到在计算时是分三步计算的。
比如(a+b)*(c+d),就是t1=a+b, t2=c+d, t3=t1*t2,了解?
野男孩 2001-09-03
  • 打赏
  • 举报
回复
哦,忘记了,上面的是1 to 10 的,要JQK,自己改吧
野男孩 2001-09-03
  • 打赏
  • 举报
回复
两年前的作品,没有去掉相同的解,当时不注意加注释,就将就点吧!
如果一定要算法说明,EMAIL ME:zzq_hello@elong.com

void start(void);
void answer(void);
void addnode(float,int,float,float,float,int,float,float,float,int,float);
void display(void);
float oprate(float,int,float);

float arr[4];
char op[]={'+','-','*','/'};
typedef struct link{
float a;
int b;
float c;
float d;
float e;
int f;
float g;
float h;
float i;
int j;
float k;
struct link *Next;
}Node;
Node *Head;

main()
{
char ch;
Node *temp,*p;
start();
answer();
printf("\n\tBye-bye");
}

void start()
{
int i;
randomize();
printf("\n\n ");

for(i=0;i<4;i++){
arr[i]=rand()%10*1.0;
if(!arr[i]) arr[i]=1.0;
printf("%8.0f",arr[i]);
}
/*
arr[0]=5.0;
arr[1]=1.0;
arr[2]=5.0;
arr[3]=5.0;
*/
printf("\n\tpress anykey to show the answer...");
getch();
}

float oprate(float a,int b,float c)
{
switch(b){
case 1:
return a+c;
case 2:
if(a-c<0) return 10001.0;
return a-c;
case 3:
return a*c;
default:
if(c==0) return 10001.0;
else return a/c;
}
}

void answer()
{
int i1,i2,i3,i4,op1,op2,op3;
float a1,a2,a3,a4,tmp1,tmp2,tmp3;
int tmp4=0;

for(i1=0;i1<4;i1++){
a1=arr[i1];
for(i2=0;i2<4;i2++){
if(i1==i2) continue;
a2=arr[i2];
for(i3=0;i3<4;i3++){
if(i3==i2||i3==i1) continue;
a3=arr[i3];
for(i4=0;i4<4;i4++){
if(i4==i1||i4==i2||i4==i3)continue;
a4=arr[i4];
for(op1=1;op1<5;op1++)
for(op2=1;op2<5;op2++)
for(op3=1;op3<5;op3++){
tmp1=oprate(a1,op1,a2);
if(tmp1-10001<-1){
tmp2=oprate(tmp1,op2,a3);
if(tmp2-10001<-1){
tmp3=oprate(tmp2,op3,a4);
if((tmp3-24.0)<0.0001&&tmp3-24.0>-0.0001){
tmp4++;
addnode(a1,op1-1,a2,tmp1,tmp1,op2-1,a3,tmp2,tmp2,op3-1,a4);
/* printf("\n1. %4.0f %c %-4.0f = %-4.0f",a1,op[op1-1],a2,tmp1);
printf("\n2. %4.0f %c %-4.0f = %-4.0f",tmp1,op[op2-1],a3,tmp2);
printf("\n3. %4.0f %c %-4.0f = 24",tmp2,op[op3-1],a4);
exit(0);*/
}
}
tmp2=oprate(a3,op3,a4);
if(tmp2-10001.0<-1.0){
tmp3=oprate(tmp1,op2,tmp2);
if(tmp3-24.0<0.0001&&tmp3-24.0>-0.0001){
tmp4++;
addnode(a1,op1-1,a2,tmp1,a3,op3-1,a4,tmp2,tmp1,op2-1,tmp2);
/* printf("\n1. %4.0f %c %-4.0f = %-4.0f",a1,op[op1-1],a2,tmp1);
printf("\n2. %4.0f %c %-4.0f = %-4.0f",a3,op[op3-1],a4,tmp2);
printf("\n3. %4.0f %c %-4.0f = 24",tmp1,op[op2-1],tmp2);
exit(0);*/
}
}
tmp1=oprate(a2,op2,a3);
if(tmp1-10001.0<0.0){
tmp2=oprate(a1,op1,tmp1);
if(tmp2-10001.0<0.0){
tmp3=oprate(tmp2,op3,a4);
if(tmp3-24.0>-0.001&&tmp3-24.0<0.00001){
tmp4++;
addnode(a2,op2-1,a3,tmp1,a1,op1-1,tmp1,tmp2,tmp2,op3-1,a4);
/*printf("\n1. %4.0f %c %-4.0f = %-4.0f",a2,op[op2-1],a3,tmp1);
printf("\n2. %4.0f %c %-4.0f = %-4.0f",a1,op[op1-1],tmp1,tmp2);
printf("\n3. %4.0f %c %-4.0f = 24",tmp2,op[op3-1],a4);
exit(0); */
}
}

}
}
}
}
}
}
}
if(!tmp4){
printf("\n\tSorry, It's no answer!");
}
else{
printf("\n\tThere are %d answers\n",tmp4);
display();
}
}

void addnode(float a,int b,float c,float d,float e,int f,float g,float h,float i,int j,float k)
{
Node *Temp,*p;
p=Head;
if(!Head){
Head=(Node*)malloc(sizeof(Node));
Head->a=a;
Head->b=b;
Head->c=c;
Head->d=d;
Head->e=e;
Head->f=f;
Head->g=g;
Head->h=h;
Head->i=i;
Head->j=j;
Head->k=k;
return;
}
while(p->Next) p=p->Next;
Temp=(Node*)malloc(sizeof(Node));
Temp->a=a;
Temp->b=b;
Temp->c=c;
Temp->d=d;
Temp->e=e;
Temp->f=f;
Temp->g=g;
Temp->h=h;
Temp->i=i;
Temp->j=j;
Temp->k=k;
Temp->Next=NULL;
p->Next=Temp;
}

void display(){
Node *p;
int i=0;
p=Head;
while(p){
i++;
printf("\n 1. %6.3f %2c %-6.3f =%6.3f",p->a,op[p->b],p->c,p->d);
printf("\n 2. %6.3f %2c %-6.3f =%6.3f",p->e,op[p->f],p->g,p->h);
printf("\n 3. %6.3f %2c %-6.3f =24.000",p->i,op[p->j],p->k);
printf("\n");
if(i%5==0) {
printf("\n\tpress any key to continue...");
getch();
}
p=p->Next;
}

}
oo 2001-09-03
  • 打赏
  • 举报
回复
最简单的是用穷举法:
用递归实现的方法:从4个中取2个(有4*3/2中可能),运用4种运算,这样就有,(4*3/2)*(4+2)种结果(因除和减各有两种可能)。把结果与另外的两个,这样就只有3个数了。
再用同样的方法,直到最后一个数,看是不是等于24。
scxy 2001-09-03
  • 打赏
  • 举报
回复
穷举,大众化
emailcdh 2001-09-03
  • 打赏
  • 举报
回复
GZ
Jans 2001-09-03
  • 打赏
  • 举报
回复
要涉及括号啊
好像没这么简单吧
能不能在具体一点
Semigod 2001-09-03
  • 打赏
  • 举报
回复
最笨的方法,先把牌值转换,然后穷举运算符,呵呵,很笨的方法
Jans 2001-09-03
  • 打赏
  • 举报
回复
哦,谢谢
不过在想问问,那对加括号怎么处理!

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧