计算24点

#include<iostream>
using namespace std;
typedef struct node
{
 double bev;//数
 char ser[15];//表达式
 int length;//表达式长度
}Bnode;
Bnode dev_4[4];//四个数
Bnode dev_3[3];//三个数
Bnode dev_2[2];//两个数
Bnode dev_1;//一个数
char flag[4]={'+','-','/','*'};
Bnode count(Bnode d1,Bnode d2,char ch)
{
  Bnode d3;//临时存放数据
  d3.length=0;//初始化表达式长度
  switch(ch)
  {
      case '+':
    d3.bev=d1.bev+d2.bev;//计算数据
    d3.ser[d3.length++]='(';
    for(int i=0;i<=d1.length;i++)
    {
     d3.ser[d3.length++]=d1.ser[i];
    }
    d3.ser[d3.length++]='+';
    for(int i=0;i<=d2.length;i++)
    {
     d3.ser[d3.length++]=d2.ser[i];
    }
    d3.ser[d3.length]=')';
    break;
   case '-':
    d3.bev=d1.bev-d2.bev;//计算数据
    d3.ser[d3.length++]='(';
    for(int i=0;i<=d1.length;i++)
    {
     d3.ser[d3.length++]=d1.ser[i];
    }
    d3.ser[d3.length++]='-';
    for(int i=0;i<=d2.length;i++)
    {
     d3.ser[d3.length++]=d2.ser[i];
    }
    d3.ser[d3.length]=')';
    break;
   case '/':
    d3.bev=d1.bev/d2.bev;//计算数据
    d3.ser[d3.length++]='(';
    for(int i=0;i<=d1.length;i++)
    {
     d3.ser[d3.length++]=d1.ser[i];
    }
    d3.ser[d3.length++]='/';
    for(int i=0;i<=d2.length;i++)
    {
     d3.ser[d3.length++]=d2.ser[i];
    }
    d3.ser[d3.length]=')';
    break;
   case '*':
    d3.bev=d1.bev*d2.bev;//计算数据
    d3.ser[d3.length++]='(';
    for(int i=0;i<=d1.length;i++)
    {
     d3.ser[d3.length++]=d1.ser[i];
    }
    d3.ser[d3.length++]='*';
    for(int i=0;i<=d2.length;i++)
    {
     d3.ser[d3.length++]=d2.ser[i];
    }
    d3.ser[d3.length]=')';
    break;
  }
  return d3;
}
void fun(int dev[])
{
 for(int i=0;i<4;i++)//初始化结构体数组
 {
  dev_4[i].bev=dev[i];
  switch(dev[i])
  {
      case 1:dev_4[i].ser[0]='1';dev_4[i].length=0;break;
   case 2:dev_4[i].ser[0]='2';dev_4[i].length=0;break;
   case 3:dev_4[i].ser[0]='3';dev_4[i].length=0;break;
   case 4:dev_4[i].ser[0]='4';dev_4[i].length=0;break;
   case 5:dev_4[i].ser[0]='5';dev_4[i].length=0;break;
   case 6:dev_4[i].ser[0]='6';dev_4[i].length=0;break;
   case 7:dev_4[i].ser[0]='7';dev_4[i].length=0;break;
   case 8:dev_4[i].ser[0]='8';dev_4[i].length=0;break;
   case 9:dev_4[i].ser[0]='9';dev_4[i].length=0;break;
   case 10:dev_4[i].ser[0]='1';dev_4[i].ser[1]='0';dev_4[i].length=1;break;
   //case 10:dev_4[i].ser[0]='1';dev_4[i].ser[1]='0';dev_4[i].length=1;break;
   //case 10:dev_4[i].ser[0]='1';dev_4[i].ser[1]='0';dev_4[i].length=1;break;
   //case 10:dev_4[i].ser[0]='1';dev_4[i].ser[1]='0';dev_4[i].length=1;break;
   //case 10:dev_4[i].ser[0]='1';dev_4[i].ser[1]='0';dev_4[i].length=1;break;
  }
  //dev_4[i].ser[0]=dev[i];
  
 }
 for(int i=0;i<4;i++)//从四个数中选两个数运算 i
 {
     for(int j=0;j<4;j++)// j
  {
   if(j==i) continue;//防止两个数重复
   else
   {
    for(int n=0;n<4;n++)//加载三个数字的运算 n,选择运算符
    {
           dev_3[0]=count(dev_4[i],dev_4[j],flag[n]);
     int mm=1;//加载辅助
     for(int m=0;m<4;m++)//m,加载其他两个数
     {
         if(m!=i&&m!=j)
      {
          dev_3[mm++]=dev_4[m];
      }
     }
     //dev_3已经加载完毕,开始三个数的计算
     for(int ii=0;ii<3;ii++)//从三个数中选择两个数运算 ii
     {
         for(int jj=0;jj<3;jj++)
      {
          if(jj==ii) continue;//防止两个数重复
       else
       {
           for(int nn=0;nn<4;nn++)
        {
            dev_2[0]=count(dev_3[ii],dev_3[jj],flag[nn]);
         for(int m=0;m<3;m++)//m,加载剩余数
         {
          //int mm=1;//加载辅助
          if(m!=ii&&m!=jj)
          {
           dev_2[1]=dev_3[m];
          }
         }
         for(int nnn=0;nnn<4;nnn++)
         {
          dev_1=count(dev_2[0],dev_2[1],flag[nnn]);
          if(abs(dev_1.bev-24)<=0.000001) 
          {
           for(int s=0;s<4;s++)
            cout<<dev[s]<<' ';
           for(int w=0;w<=dev_1.length;w++)
           {
            cout<<dev_1.ser[w];
           }
           cout<<endl;
           goto lopo;
          }
             if(nnn!=0&&nnn!=3)
          {
           dev_1=count(dev_2[1],dev_2[0],flag[nnn]);
           if(abs(dev_1.bev-24)<=0.000001) 
           {
            for(int s=0;s<4;s++)
                cout<<dev[s]<<' ';
            for(int w=0;w<=dev_1.length;w++)
            {
             cout<<dev_1.ser[w];
            }
            cout<<endl;
            goto lopo;
           }
          }
         }
         
        }
       }
      }
     }
    }
   }
  }
 }
lopo:
 ;

}

int main()
{
 int dev[4];//四个数
    for(int i=1;i<=10;i++)
 {
  dev[0]=i;
  for(int j=i;j<=10;j++)//j=i为防止出现重复,下同n=j,m=n
  {
   dev[1]=j;
   for(int n=j;n<=10;n++)
   {
    dev[2]=n;
    for(int m=n;m<=10;m++)
    {
     dev[3]=m;
        fun(dev);
    }
   }
  }
 }
 //fun(dev);
 //cout<<8.0/(3-8.0/3)<<endl;
 system("pause");
    return 0;
}

  

posted @ 2013-07-15 16:46  liyunyu1  阅读(207)  评论(0编辑  收藏  举报