|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 juhugufudu 于 2020-2-21 10:03 编辑
24点游戏算法分析
1.分5种情况(空格中的是{'+','-','*','/'})
((A B) C) D
(A (B C)) D
A ((B C) D)
A (B (C D))
(A B)(C D)
2.变换符号有 3个,所以我们用三重循环来(ps:放到第二重要的函数中)
for(op1 = 1;op1<=4;op1++){
for(op2 = 1;op2<=4;op2++){
for(op3 = 1;op3<=4;op3++){
1 -> +;
2 -> -;
3 -> *;
4 -> /;
}
}
}
3.关于输入
输入的是四个整数 -> a,b,c,d
来一个判断参数 -> runOk(a,b,c,d,op1,op2,op3)
runOk的作用是 -> (上传参数给子参数,并输出)
子函数为 -> m1,m2,m3,m4,m5 ->作用是确定一下符号(ps:返回的是24 or !24)
子函数参数列表为 -> a,b,c,d,op1,op2,op3
4.关于输出
直接一个printf()输出语句 -> 在runOk的函数里
Like调用一下m1:
if(m1(a,b,c,d,op1,op2,op3) == 24)
printf("((%d%c%d)%c%d)%c%d",a,op[op1],b,op[op2],c,op[op3],d);
5.细节
子的子函数中,是放回对应的运算结果的(运算加减乘除)
关键代码如下:
switch(op){
case 1:
return a+b;
case 2:
return a-b;
case 3:
return a*b;
case 4:
return a/b;
}
调用就比较麻烦:(其实是最简单的了)
double f1 = fun(a,b,op1);
double f2 = fun(f1,c,op2);
double f3 = fun(f2,d,op3);
6.最后
代码大概是这样的:
(1)开始
(2)输入四个数字 -> a,b,c,d
(3)如果(get24(a,b,c,d))为真:
否则 printf("你整的我蒙了...\n")
(4)结束
get24()
{
for 三重循环 -> 1~4 -> op1,op2,op3
{
如果(m1(a,b,c,d,op1,op2,op3) == 24){
打印("((%d%c%d)%c%d)%c%d",a,op[op1],b,op[op2],c,op[op3],d");
flag = 1
}
如果(m2..) flag = 1;
...
}
}
if(flag != 1 )return 0;
else return 1;
m1 -> ((A B) C) D
double f1 = fun(a,b,op1);
double f2 = fun(f1,c,op2);
double f3 = fun(f2,d,op3);
return f3;
m2 -> (A (B C))D
double f1 = fun(b,c,op2);
double f2 = fun(f1,a,op1);
double f3 = fun(f2,d,op3);
return f3;
m3 -> A ((B C) D)
double f1 = fun(b,c,op2);
double f2 = fun(f1,d,op3);
double f3 = fun(f2,a,op1);
return f3;
m4 = A (B (C D))
double f1 = fun(c,d,op3);
double f2 = fun(f1,b,op2);
double f3 = fun(f2,a,op1);
return f3;
m5 -> (A B)(C D)
double f1 = fun(a,b,op1);
double f2 = fun(c,d,op3);
double f3 = fun(f1,f2,op2);
return f3;
end func.
double pe(a,b,op){
switch(op){
case 1:
return a+b;
case 2:
return a-b;
case 3:
return a*b;
case 4:
return a/b;
}
}
end.
数据结构:
1.FILE *fin,*fout;
2.char fp[5] = {'#','+','-','*','/'};
3.int a,b,c,d; -> 为了之前code的有效性,最好定义在 main()
4...........
|
|