送给不喜欢写搜索的孩子们
查看原帖
送给不喜欢写搜索的孩子们
342185
__builtin_orz楼主2024/10/14 21:24

超重宏做法

#include<algorithm>
#include<cstdio>
#include<cstdlib>
struct Val{
	int val;
	Val(int val=0):val(val){}
	void eval(){}
};
template<typename L,typename R>struct Expr{
	L l;
	R r;
	char op;
	int val;
	Expr(L l,char op,R r):l(l),op(op),r(r){
		if(op=='+')val=l.val+r.val;
		if(op=='-')val=l.val-r.val;
		if(op=='*')val=l.val*r.val;
		if(op=='/')val=l.val/r.val;
	}
	void eval(){
		l.eval();
		r.eval();
		if(op=='+'||op=='*')
			printf("%d%c%d=%d\n",std::max(l.val,r.val),op,std::min(l.val,r.val),val);
		else
			printf("%d%c%d=%d\n",l.val,op,r.val,val);
	}
};
template<typename L,typename R>
Expr<L,R>make_Expr(L l,char op,R r){
	return Expr<L,R>(l,op,r);
}
template<typename T>
void f(T x){
	if(x.val==24){
		x.eval();
		exit(0);
	}
}
template<typename A,typename B>
void f(A a,B b){
#define L(op,a,b)f(make_Expr(a,op,b));
#define K(a,b)\
	L('+',a,b)\
if(a.val>b.val)\
	L('-',a,b)\
	L('*',a,b)\
if(b.val&&a.val%b.val==0)\
	L('/',a,b)
#define J(a,b)K(a,b)K(b,a)
	J(a,b)
}
template<typename A,typename B,typename C>
void f(A a,B b,C c){
#define I(op,a,b,c)f(make_Expr(a,op,b),c);
#define H(a,b,c)\
	I('+',a,b,c)\
if(a.val>b.val)\
	I('-',a,b,c)\
	I('*',a,b,c)\
if(b.val&&a.val%b.val==0)\
	I('/',a,b,c)
#define E(a,b,c)H(a,b,c)H(a,c,b)
#define D(a,b,c)E(a,b,c)E(b,a,c)E(c,a,b)
	D(a,b,c)
}
void f(int a,int b,int c,int d){
#define G(op,a,b,c,d)f(make_Expr(Val(a),op,Val(b)),Val(c),Val(d));
#define F(a,b,c,d)\
	G('+',a,b,c,d)\
if(a>b)\
	G('-',a,b,c,d)\
	G('*',a,b,c,d)\
if(b&&a%b==0)\
	G('/',a,b,c,d)
#define C(a,b,c,d)F(a,b,c,d)F(a,b,d,c)
#define B(a,b,c,d)C(a,b,c,d)C(a,c,b,d)C(a,d,b,c)
#define A(a,b,c,d)B(a,b,c,d)B(b,a,c,d)B(c,a,b,d)B(d,a,b,c)
	A(a,b,c,d);
}
int main(){
	int a,b,c,d;
	scanf("%d%d%d%d",&a,&b,&c,&d);
	f(a,b,c,d);
	printf("No answer!");
	return 0;
}

以及真正的超重宏(洛谷似乎过不了编译)

#include<algorithm>
#include<cstdio>
#include<cstdlib>
struct Val{
	int val;
	Val(int val_=0){val=val_;}
	void eval(){}
};
template<typename L,typename R>struct Expr{
	L l;
	R r;
	char op;
	int val;
	Expr(){}
	Expr(L l_,char op_,R r_){
		l=l_;
		op=op_;
		r=r_;
		if(op=='+')val=l.val+r.val;
		if(op=='-')val=l.val-r.val;
		if(op=='*')val=l.val*r.val;
		if(op=='/')val=l.val/r.val;
	}
	void eval(){
		l.eval();
		r.eval();
		if(op=='+'||op=='*')
			printf("%d%c%d=%d\n",std::max(l.val,r.val),op,std::min(l.val,r.val),val);
		else
			printf("%d%c%d=%d\n",l.val,op,r.val,val);
	}
};
template<typename L,typename R>
Expr<L,R>make_Expr(L l,char op,R r){return Expr<L,R>(l,op,r);}
int main(){
	int a,b,c,d;
	scanf("%d%d%d%d",&a,&b,&c,&d);
#define f(x)if(x.val==24){x.eval();return 0;}
#define L(op,a,b)f(make_Expr(a,op,b))
#define K(a,b)\
	L('+',a,b)\
if(a.val>b.val)\
	L('-',a,b)\
	L('*',a,b)\
if(b.val&&a.val%b.val==0)\
	L('/',a,b)
#define J(a,b)K(a,b)K(b,a)
#define I(op,a,b,c)J(make_Expr(a,op,b),c)
#define H(a,b,c)\
	I('+',a,b,c)\
if(a.val>b.val)\
	I('-',a,b,c)\
	I('*',a,b,c)\
if(b.val&&a.val%b.val==0)\
	I('/',a,b,c)
#define E(a,b,c)H(a,b,c)H(a,c,b)
#define D(a,b,c)E(a,b,c)E(b,a,c)E(c,a,b)
#define G(op,a,b,c,d)D(make_Expr(Val(a),op,Val(b)),Val(c),Val(d))
#define F(a,b,c,d)\
	G('+',a,b,c,d)\
if(a>b)\
	G('-',a,b,c,d)\
	G('*',a,b,c,d)\
if(b&&a%b==0)\
	G('/',a,b,c,d)
#define C(a,b,c,d)F(a,b,c,d)F(a,b,d,c)
#define B(a,b,c,d)C(a,b,c,d)C(a,c,b,d)C(a,d,b,c)
#define A(a,b,c,d)B(a,b,c,d)B(b,a,c,d)B(c,a,b,d)B(d,a,b,c)
	A(a,b,c,d);
	printf("No answer!");
	return 0;
}
2024/10/14 21:24
加载中...