经典问题24点游戏

monkey_D_feilong 2016-10-19 09:15:12
这道题算是一个经典题目,但是我在网上没有看到有人写出去重的方法。我想在这里求助一下,这个题怎么去掉加法和乘法的重复结果。
题是这样的:输入4个正整数,利用加减乘除和括号,计算24,输出所有的表达式,去掉加法和乘法重复的结果,比如(6-(6/5))*5和5*(6-(6/5))是一样的结果。
...全文
302 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-10-20
  • 打赏
  • 举报
回复
勤奋的小游侠 2016-10-20
  • 打赏
  • 举报
回复
这个式子是二叉树的中序访问。将所有式子还原成2叉树,然后对比这个2杈树,对比时,注意以*号和+为根左右子树满足交换律,认为是相同的。
paschen 版主 2016-10-19
  • 打赏
  • 举报
回复
引用之前收藏的赵4老师代码

//定义下面5种运算顺序:
// ((A   @   B)  @   C)  @   D
//  (A   @   B)  @  (C   @   D)
//  (A   @  (B   @   C)) @   D
//   A   @ ((B   @   C)  @   D)
//   A   @  (B   @  (C   @   D))
//23.99<计算结果<24.01
//其中:
//1≤A、B、C、D≤13
//@为“+、-、*、/”之一
//用浮点数计算,循环遍历以上所有情况即可。
#include <stdio.h>
int A,B,C,D,N;
float r,r1,r2;
char op1,op2,op3;
char opc[4]={'+','-','*','/'};
void main() {
	N=0;
	for (A=1;A<=13;A++) {
		for (B=1;B<=13;B++) {
			for (C=1;C<=13;C++) {
				for (D=1;D<=13;D++) {
					for (op1=0;op1<4;op1++) {
						for (op2=0;op2<4;op2++) {
							for (op3=0;op3<4;op3++) {
								// ((A   @   B)  @   C)  @   D
								r=(float)A;
								switch (op1) {case 0:r =r +B ;break;case 1:r =r -B ;break;case 2:r =r *B ;break;case 3:r =r /B ;break;}
								switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
								switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
								if (23.99f<r && r<24.01f) {N++;printf("%8d: ((%2d%c%2d)%c%2d)%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

								//  (A   @   B)  @  (C   @   D)
								r1=(float)A;
								switch (op1) {case 0:r1=r1+B ;break;case 1:r1=r1-B ;break;case 2:r1=r1*B ;break;case 3:r1=r1/B ;break;}
								r2=(float)C;
								switch (op3) {case 0:r2=r2+D ;break;case 1:r2=r2-D ;break;case 2:r2=r2*D ;break;case 3:r2=r2/D ;break;}
								switch (op2) {case 0:r =r1+r2;break;case 1:r =r1-r2;break;case 2:r =r1*r2;break;case 3:if (-0.01f<r2 && r2<0.01f) goto STEP3; r=r1/r2;break;}
								if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c%2d)%c(%2d%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

								//  (A   @  (B   @   C)) @   D
STEP3:
								r=(float)B;
								switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
								switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r  && r <0.01f) goto STEP4; r=A /r ;break;}
								switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
								if (23.99f<r && r<24.01f) {N++;printf("%8d: (%2d%c(%2d%c%2d))%c%2d=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

								//   A   @ ((B   @   C)  @   D)
STEP4:
								r=(float)B;
								switch (op2) {case 0:r =r +C ;break;case 1:r =r -C ;break;case 2:r =r *C ;break;case 3:r =r /C ;break;}
								switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
								switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r  && r <0.01f) goto STEP5; r=A /r ;break;}
								if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c((%2d%c%2d)%c%2d)=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}

								//   A   @  (B   @  (C   @   D))
STEP5:
								r=(float)C;
								switch (op3) {case 0:r =r +D ;break;case 1:r =r -D ;break;case 2:r =r *D ;break;case 3:r =r /D ;break;}
								switch (op2) {case 0:r =B +r ;break;case 1:r =B -r ;break;case 2:r =B *r ;break;case 3:if (-0.01f<r  && r <0.01f) continue;   r=B /r ;break;}
								switch (op1) {case 0:r =A +r ;break;case 1:r =A -r ;break;case 2:r =A *r ;break;case 3:if (-0.01f<r  && r <0.01f) continue;   r=A /r ;break;}
								if (23.99f<r && r<24.01f) {N++;printf("%8d: %2d%c(%2d%c(%2d%c%2d))=24\n",N,A,opc[op1],B,opc[op2],C,opc[op3],D);}
							}
						}
					}
				}
			}
		}
	}
}
//     1: (( 1+ 1)+ 1)* 8=24
//     2: ( 1+( 1+ 1))* 8=24
//     3: ( 1+ 1)*( 1+11)=24
// ... ...
// 53280: (13+13)/(13/12)=24
// 53281: (13-(13/13))+12=24
// 53282: 13-((13/13)-12)=24

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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