24点游戏起源于扑克牌智力游戏。
规则:
A-10:分别代表数字 1-10。J,Q,K:分别代表数字11,12,13。
给四张扑克牌,用加减乘除和括号,得出24.
考虑到规模比较小,可以通过穷举的方法来得出结果,最多穷举1536次。
具体看源代码:

#include <iostream>
#include 
<cmath>
#include 
<ctime>
#include 
<cstdio>

int GetNum()
{
  
static    int nums[1000];
  
static        int index = -1;
  
if(index == -1 || index >= 1000)
  {
     srand( (unsigned)time(NULL) );
     
for(int i=0;i<1000;i++)
     {
          nums[i] 
= rand();
     }
     index 
= 0;
  }
  
return nums[index++];
}

char uppercase(char a)
{
    
if(a>=97 && a<=122)
        
return (a - 32);
    
else 
        
return a;
}

int operate(int a,int b,int op)
{
    
switch(op)
    {
    
case 0:
        
return a+b;
    
case 1:
        
return a-b;
    
case 2:
        
return a*b;
    
case 3:
        
if(a%== 0)
        
return a/b;
    
default:
        
return 10000//若a不能整除b返回一个很大的数 使它不能等于24
    }
}

char GetSign(int op)
{
    
switch(op)
    {
    
case 1:
        
return '-';
    
case 2:
        
return '*';
    
case 3:
        
return '/';
    
case 0:
        
return '+';
    
default:
        
return '?';
    }
}

void caculate(int data[],int array[])
{
    
int times = 0;
    
// 穷举所有可能 
    
// i1 i2 i3 i4 为变量 i5 i6 i7 为运算符
    for(int i1 = 0;i1<4;i1++)
    
for(int i2 = 0;i2<4;i2++)
    {
            
if(i2==i1)
            
continue;
      
for(int i3=0;i3<4;i3++)
      {
          
if(i3==i1||i3==i2)
              
continue;
          
for(int i4=0;i4<4;i4++)
          {
              
if(i4==i1||i4==i2||i4==i3)
                  
continue;
              
for(int i5=0;i5<4;i5++)
              {
                  
for(int i6=0;i6<4;i6++)
                  {
                      
for(int i7=0;i7<4;i7++)
                      {
                          
//计算三次
                          times++;
                          
int k1 = operate(data[i1],data[i2],i5);
                              k1 
= operate(k1,data[i3],i6);
                              k1 
= operate(k1,data[i4],i7);
                              
if(k1==24)
                              {
                                array[
8= times;
                                array[
0= 1;
                                array[
1= i1;
                                array[
2= i2;
                                array[
3= i3;
                                array[
4= i4;
                                array[
5= i5;
                                array[
6= i6;
                                array[
7= i7;
                                
return;
                              }
                      }
//i7
                  }//i6
              }//i5
          }//i4
      }//i3
    }//i2
   array[0= 0;
   array[
8= times;
        
}

int main(void)
{
    
int data[4];
    
int array[9]; // array[0]表示是否有计算 array[1~7] 表达式 array[8] 计算次数
    char order = '\0';
    
while(true)
    {
        std::cout
<<" auto create data(A) or Read from file (R) or Manual input (M):";
        
while(std::cin>>order,order = uppercase(order),order!='A' && order != 'R' &&order != 'M')
        {
            std::cout
<<" auto create data(A) or read from file (R) or Manual input (M):";        
        }
        
switch(order)
        {
            
case 'A' :
                {
                    
for(int i=0;i<4;i++)
                    {
                        data[i] 
= GetNum()%13+1;
                    }
                    
break;
                }
            
case 'H':
                {
                        
int tp;
                        
for(int i=0;i<4;i++)
                        {
                            std::cin
>>tp;
                            data[i] 
= tp;
                        }
                        
break;
                }
            
case 'M' :
                {
                    
int tp = 0;
                    
char fname[100];
                   
                    std::cout
<<"input filename:";    
                    std::cin
>>fname;
                    FILE 
*fp = fopen(fname,"r");
                    
if(fp)
                    {
                        
for(int i=0;i<4;i++)
                        {
                            fscanf(fp,
"%d",tp);
                            data[i] 
= tp;
                        }
                        fclose(fp);
                    }
                    
else
                    {
                        std::cout
<<"read file error!\n";
                        
return 0;
                    }
                    
break;
                }

        }
        std::cout
<<"the data: ";
        
for(int i=0;i<4;i++)
            std::cout
<<data[i]<<' ';

                caculate(data,array);

        
if(array[0])
        {
            std::cout
<<"\nthe result: ";
            std::cout
<<"(("<<data[array[1]]<<GetSign(array[5])<<data[array[2]]<<')'
                
<<GetSign(array[6])<<data[array[3]]<<')'
                 
<<GetSign(array[7])<<data[array[4]]<<std::endl;        
        }
        
else
        {
            std::cout
<<"\nThey can't Get 24!"<<std::endl;
        }
            std::cout
<<"The running count is "<<array[8]<<std::endl;
    }
    
return 0;
}