/*
* 24.cpp Author-ZhiQiao
* 24 点游戏
* 四个 1 到 10 之间的整数, 每个数都必须使用且只能用一次.
* 加,减,乘,除可以随意使用,设法使运算结果为24.
*/
#include<iostream.h>
#include<conio.h>
#define N 4
//LOOP 宏的定义为了书写方便
#define LOOP(i) for(i=0; i<N; i++)
//此函数将void型指针转换为四个操作符对应的函数指针.
#define F(i) ( (int(*)(int,int))opt[i] )
#define FI F(i)
#define FJ F(j)
#define FK F(k)
//定义+,-,x,/四个操作对应的函数
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int mul(int a, int b) { return a * b; }
int div(int a, int b)
{ //如果a不能被b整除或b为0就返回一个比较大的整数
if(b==0 || a%b) return 2401;
return a/b;
}
//=====================================================================
// 根据相应函数在数组中的下标判断其运算符号,用来输出结果
char whichOpt(int index)
{
if(index==0) return '+';
else if(index==1) return '-';
else if(index==2) return '*';
return '/';
}
// 求解24点的算法实现
void howObtain24(int num[], void* opt[])
{
int i,j,k,a,b,c,d;
LOOP(i) LOOP(j) LOOP(k) //选择运算符
LOOP(a) LOOP(b) LOOP(c) LOOP(d) //数字不同的排列顺序
{
if(a==b||a==c||a==d||b==c||b==d||c==d)
continue;
if( FI(FJ(FK(num[a], num[b]), num[c]), num[d]) == 24){
cout << "((" << num[a] << whichOpt(k) << num[b] << ')'
<< whichOpt(j) << num[c] << ')'
<< whichOpt(i) << num[d] << endl;
goto END;
}
if( FI(FJ(num[a], num[b]), FK(num[c], num[d])) == 24 ){
cout << '(' << num[a] << whichOpt(j) << num[b] << ')'
<< whichOpt(i) <<
'(' << num[c] << whichOpt(k) << num[d] << ')' << endl;
goto END;
}
}
cout << "这几个数字无法得到 24/n"; return;
END: return;
}
//=======================================================================
int main()
{
//四个数字
int num[N];
//四个运算符对应的函数指针
void* opt[N] = { (void*)add, (void*)sub, (void*)mul, (void*)div };
cout << "请输入四个 1 到 10 之间的整数 :/n";
for(int i=0; i<N; i++) cin >> num[i];
for(int j=0; j<N; j++)
if(num[j]<1 || num[j]>10){
cout << "输入不符合要求!/n";
return 0;
}
howObtain24(num,opt);
return 0;
}