24点游戏 C++

来源:互联网 发布:软件部署方案 编辑:程序博客网 时间:2024/04/28 01:41



#include <iostream>  

#include <string>

#include <vector>

#include <algorithm>

#include <iterator>

#include <cmath>

using namespace std;

//存放解集 

vector<string> ivec;

// 第1个数和第2个数的值及表达式

double key1_2[6] = { 0 };

string exp1_2[6];

//第3个数和第4个数的值及表达式 

double key3_4[6] = { 0 };

string exp3_4[6];

//第3个数和前2个数的值及表达式 

double key12_3[6] = { 0 };

string exp12_3[6];

// 第4个数和前3个数的值及表达式 

double key123_4[6] = { 0 };

string exp123_4[6];

// 前2个数和后2个数的值及表达式 

double key12_34[6] = { 0 };

string exp12_34[6];

// 函数声明 

int Permutation(int[], int[][4]);

void Calc(double, double, double[], string[], string, string);

void Work(int[], int[][4], int);

//主函数

int main()

{

 int num[4] = { 0 };

 int array[24][4] = { 0 };

 int count = 0;

 //读入数据

 for (int i = 0; i < 4; i++)

 {    
  num[i]=rand()%13;
     cout << num[i] << endl;

 }

 //待检测数据的数量

 count = Permutation(num, array);

 //求解24点 

 Work(num, array, 24);

 // 对结果进行排序 

 sort(ivec.begin(), ivec.end());

 // 去掉重复的解

 vector<string>::iterator iter = unique(ivec.begin(), ivec.end());

 // 输出解集

 if (ivec.size() != 0)

 {

  cout << "该组数据的解集为:" << endl;

  for (vector<string>::iterator it = ivec.begin(); it != iter; it++)

  {

   cout << *it << endl;

  }

 }

 else

 {

  cout << "该组数据无解" << endl;

 }

 system("pause");

 return 0;

}

//计算2个数,保存值及表达式

void Calc(double a, double b, double key[], string exp[], string expa, string expb)

{

 key[0] = a + b;

 exp[0] = '(' + expa + '+' + expb + ')'; //判断加法能否算出

 key[1] = a - b;

 exp[1] = '(' + expa + '-' + expb + ')'; //判断减法能否算出

 key[2] = b - a;

 exp[2] = '(' + expb + '-' + expa + ')';

 key[3] = a * b;

 exp[3] = '(' + expa + '*' + expb + ')'; //判断乘法能否算出

 if (b > 0)

 {

  key[4] = a / b;

  exp[4] = '(' + expa + '/' + expb + ')'; //判断除法能否算出

 }

 if (a > 0)

 {

  key[5] = b / a;

  exp[5] = '(' + expb + '/' + expa + ')';

 }

}

// 生成数据的排列组合 

int Permutation(int num[], int array[][4])

{

 int flag;

 int k = 0;

 int count = 0;

 int i, j, m, n, s;

 for (i = 0; i < 4; i++)

 {

  for (j = 0; j < 4; j++)

  {

   for (m = 0; m < 4; m++)

   {

    for (n = 0; n < 4; n++)

    {

     if (i != j && i != m && i != n && j != m && j != n && m != n)

     {

      flag = 1;

      for (s = 0; s < k; s++)

      {

       if (array[s][0] == num[i] && array[s][1] == num[j] && array[s][2] == num[m] && array[s][3] == num[n])

       {

        flag = 0;

       }

      }

      if (flag == 1)

      {

       array[k][0] = num[i];

       array[k][1] = num[j];

       array[k][2] = num[m];

       array[k][3] = num[n];

       k++;

       count++;

      }

     }

    }

   }

  }

 }

 return count;

}

// 求解24点 

void Work(int num[], int array[][4], int count)

{

 for (int i = 0; i < count; i++)

 {

  char buffer[20];

  string expa, expb;

  // 转换第1个数字为表达式 

  _itoa(array[i][0], buffer, 10);

  expa = buffer;

  // 转换第2个数字为表达式 

  _itoa(array[i][1], buffer, 10);

  expb = buffer;

  // 计算第1个数和第2个数

  Calc(array[i][0], array[i][1], key1_2, exp1_2, expa, expb);

  //(((A,B),C),D)形式 

  for (int j = 0; j < 6; j++)

  {

   //转换第3个数字为表达式

   _itoa(array[i][2], buffer, 10);

   expb = buffer;

   //计算第3个数和前2个数 

   Calc(key1_2[j], array[i][2], key12_3, exp12_3, exp1_2[j], expb);

   for (int k = 0; k < 6; k++)

   {

    // 转换第4个数字为表达式 

    _itoa(array[i][3], buffer, 10);

    expb = buffer;

    // 计算第4个数和前3个数 

    Calc(key12_3[k], array[i][3], key123_4, exp123_4, exp12_3[k], expb);

    for (int t = 0; t < 6; t++)

    {

     if (fabs(key123_4[t] - 24) < 1e-6)

     {

      ivec.push_back(exp123_4[t]);

     }

    }

   }

  }

  // 转换第3个数字为表达式 

  _itoa(array[i][2], buffer, 10);

  expa = buffer;

  // 转换第4个数字为表达式 

  _itoa(array[i][3], buffer, 10);

  expb = buffer;

  // 计算第3个数和第4个数 

  Calc(array[i][2], array[i][3], key3_4, exp3_4, expa, expb);

  //((A,B),(C,D))形式

  for ( j = 0; j < 6; j++)

  {

   for (int k = 0; k < 6; k++)

   {

    // 计算前2个数和后2个数 

    Calc(key1_2[j], key3_4[k], key12_34, exp12_34, exp1_2[j], exp3_4[k]);

    for (int t = 0; t < 6; t++)

    {

     if (fabs(key12_34[t] - 24) < 1e-6)

     {

      ivec.push_back(exp12_34[t]);

     }

    }

   }

  }

 }

}

0 0
原创粉丝点击