24点游戏 C++

论坛 期权论坛 脚本     
匿名技术用户   2021-1-4 20:42   42   0


#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 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP