24点游戏算法 c语言,24点游戏算法问题

这是一个C语言程序,用于解决24点游戏的计算问题。程序通过遍历不同的运算符组合,检查是否能得到24这个结果。用户输入4个数字,程序会尝试各种括号和运算符排列来寻找解决方案并打印出来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/* HELLO.C -- Hello, world */ #include "stdio.h"

#include "conio.h"

#include "stdlib.h"

#include "time.h"

#include "math.h"

#include "ctype.h"

int JS(int a,int b,int c) /*两数计算*/

{if(c==0) return a+b;

if(c==1) return a-b;

if(c==2) return a*b;

else if(b==0||a%b!=0) return -9999;

else return a/b; }

char FH(int a) /*打印符号*/

{if(a==0) return '+';

else if(a==1) return '-';

else if(a==2) return '*';

else return '/';}

int main()

{int a[4],b[4],c[4],d[4];

int n;

int sum1,sum2,sum3,sum; printf("输入4个数\n");

for(n=0;n<=3;n++)

scanf("%d",&a[n]); for(c[0]=0;c[0]<=3;c[0]++)

{for(c[1]=0;c[1]<=3;c[1]++)

{if(c[1]==c[0]) continue;

for(c[2]=0;c[2]<=3;c[2]++)

{if(c[2]==c[1]||c[2]==c[0]) continue;

c[3]=6-c[2]-c[1]-c[0];

if(c[3]==c[2]||c[3]==c[1]||c[3]==c[0]) continue;

for(n=0;n<=3;n++)

b[n]=a[c[n]]; /*从上面到到本句为交换4个数的输入顺序*/

for(n=0;n<=255;n++)

/*在不考虑分数的情况,4种括号,3个计算符,所以总得有256可能*/

/*考虑分数的话8种括号都需要算吧,但那样重复的太多了,先写简单的吧*/

{d[0]=(n&3)/1;d[1]=(n&12)/4;d[2]=(n&48)/16;d[3]=(n&192)/64;

/*d[0]为括号 d[1],d[2],d[3] 分别为第1,2,3个计算符号*/

if(d[0]==0){if((d[2]<=1)&&(d[3]>=2)) ;

/*只计算(a+b)*c*d这样第2符号优先级不低于第3符号式子*/

/*第3符号比第2个高的由其他式子计算*/

else {sum1=JS(b[0],b[1],d[1]);

sum2=JS(sum1,b[2],d[2]);

sum3=JS(sum2,b[3],d[3]);

if(sum3==24)

printf("(%d%c%d)%c%d%c%d=24\n",b[0],FH(d[1]),b[1],FH(d[2]),b[2],FH(d[3]),b[3]);

}

}

if(d[0]==1){if((d[1]<=1)&&(d[2]>=2)) ;

/*只计算(a+b+c)*d这样第1符号和第2符号优先级相同的算法*/

/*第2符号比第1符号优先的式子由其他式子计算*/

else

{sum1=JS(b[0],b[1],d[1]);

sum2=JS(sum1,b[2],d[2]);

sum3=JS(sum2,b[3],d[3]);

if(sum3==24.0)

printf("(%d%c%d%c%d)%c%d=24\n",b[0],FH(d[1]),b[1],FH(d[2]),b[2],FH(d[3]),b[3]);

}

}

if(d[0]==2){ /*没啥讲的,3步计算都固定死了,就是与其他式子重复的多了*/

sum1=JS(b[1],b[2],d[2]);

sum2=JS(b[0],sum1,d[1]);

sum3=JS(sum2,b[3],d[3]);

if(sum3==24)

printf("(%d%c(%d%c%d))%c%d=24\n",b[0],FH(d[1]),b[1],FH(d[2]),b[2],FH(d[3]),b[3]);

}

if(d[0]==3){if((d[2]>=2&&(d[1]>=2||d[3]>=2))||(d[2]<=1&&(d[1]<=1||d[3]<=1)));

/*也是3步都固定死的,第1或者第3的优先级与第2的相同的话可以转换成第1或者第2个式子或者无解,所以不计算*/

else {sum1=JS(b[0],b[1],d[1]);

sum2=JS(b[2],b[3],d[3]);

sum3=JS(sum1,sum2,d[2]);

if(sum3==24)

printf("(%d%c%d)%c(%d%c%d)=24\n",b[0],FH(d[1]),b[1],FH(d[2]),b[2],FH(d[3]),b[3]);

}

}

} }

}

} getch();

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值