24点

来源:互联网 发布:淘宝上的组装电脑 编辑:程序博客网 时间:2024/04/30 00:10

/*
 * 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;
}