24 点游戏的初步算法

#include <cstdlib>
#include <iostream>

using namespace std;

double a0,a1,a2,a3,a4;
int b1,b2,b3;
int i;
int k=0;
int a[13];
const double TARGET = 25;

double operate( double a, double b, int c)
{
    switch(c)
    {
        case 1: return (a+b);
        case 2: return (a-b);
        case 3: return (a*b);
        case 4: return (a/b);
    }
    return 0;
}

char disp(int a)
{
     switch(a)
     {
        case 1: 
           return '+';
        case 2:
           return '-';
        case 3:
           return '*';
        case 4:
           return '//';
      }
      return '?';
}

bool sort(int a)
{
    double result;
    switch(a)
    {
        case 1:
             result = operate(operate(operate(a1,a2,b1),a3,b2),a4,b3);
             break;
        case 2:
             result = operate(operate(a1,operate(a2,a3,b2),b1),a4,b3);
             break;
        case 3:
             result = operate(operate(a1,a2,b1),operate(a3,a4,b3),b2);
             break;
        case 4:
             result = operate(a1,operate(operate(a2,a3,b2),a4,b3),b1);
             break;
        case 5:
             result = operate(a1,operate(a2,operate(a3,a4,b3),b2),b1);
             break;
        case 6:
             result = operate(operate(a1,operate(a2,a3,b2),b1),a4,b3);
             break;
    }
    if( (TARGET-0.0001)<result && result<(TARGET+0.0001) )
        return 1;
     else
        return 0; 
} 


int geta()
{
     switch(i)
     {
       case 1: break;
       case 2: a0=a3;a3=a4;a4=a0; break;
       case 3: a0=a2;a2=a4;a4=a0; break;
       case 4: a0=a3;a3=a4;a4=a0; break;
       case 5: a0=a2;a2=a4;a4=a0; break;
       case 6: a0=a3;a3=a4;a4=a0; break;
       case 7: a0=a3;a3=a4;a4=a0;    a0=a3;a3=a1;a1=a0;   a0=a2;a2=a4;a4=a0; break;
       case 8: a0=a3;a3=a2;a2=a0; break;
       case 9: a0=a3;a3=a4;a4=a0; break;
       case 10: a0=a3;a3=a2;a2=a0; break;
       case 11: a0=a2;a2=a4;a4=a0;   a0=a1;a1=a2;a2=a0;   break;
       case 12: a0=a3;a3=a2;a2=a0; break;    
       case 13: return 0;     
     }
     a0 = a1*100008 + a2*1005 + a3*12 + a4;
     
     int j=0;
     for(j=1; j<=k; j++)
     { 
        if(a[j]==a0)
        {
           j=155;
           break;
        }
     }
     
     if(j==155)
     {
        i++;
       geta();
     }
     else
     {
        k++;
        a[k]=(int)a0;
     }
     return 0;
}

int main(int argc, char *argv[])
{
    cout << "请输入四个数字,用空格间隔开:"; 
    while(cin >> a1 >> a2 >> a3 >> a4)
    { 

       int outcome=0;
       int way;
       int num=0;

       for( i=1; i<=12; i++)
       {
       geta();
       if(i>12) break;
       for( way=1; way<=5; way++)
       {
          for( b1=1; b1<=4; b1++)
          {
             for( b2=1; b2<=4; b2++)
             {
                for( b3=1; b3<=4; b3++)
                {
                   if( sort(way) == true )
                   {
                      switch(way)
                      {
                         case 1:
                            num++;
                            cout << "case " << num << ": " << '(' << '(' << a1 << disp(b1) << a2 << ')' << disp(b2) << a3 << ')' << disp(b3) << a4 << endl;
                            break;
                         case 2:
                            num++;
                            cout << "case " << num << ": " << '(' << a1 << disp(b1) << '(' << a2 << disp(b2) << a3 << ')' << ')' << disp(b3) << a4 << endl;
                            break;
                         case 3:
                            num++;
                            cout << "case " << num << ": " << '(' << a1 << disp(b1) << a2 << ')' << disp(b2) << '(' << a3 << disp(b3) << a4 << ')' << endl;
                            break;
                         case 4:
                            num++;
                            cout << "case " << num << ": " << a1 << disp(b1) << '(' << '(' << a2 << disp(b2) << a3 << ')' << disp(b3) << a4 << ')' << endl;
                            break;
                         case 5:
                            num++;
                            cout << "case " << num << ": " << a1 << disp(b1) << '(' << a2 << disp(b2) << '(' << a3 << disp(b3) << a4 << ')' << ')' << endl;
                            break;
                      }
                   }
                }
             }
          }
       }
       }
       if(num==0)
          cout << "无解" << endl;
      cout << "====请继续输入====" << endl;
    }
    //system("PAUSE");
    return EXIT_SUCCESS;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值