用扑克牌计算24点(线性结构,数组)
[问题描述]
一副扑克牌的每张牌表示一个数(J、Q、K分别表示11、12、13,两个司令都表示6)。任取4张牌,即得到1-13的数,请添加运算符(规定为加、减、乘、除四种)使之成为运算式。每个数只能参与一次运算,4个数顺序可以任意组合,4个运算符任意取3个且可以重复取。运算遵从一定有限级别,可加括号控制,最终使运算结果为24.请输出一种解决方案的表达式,用括号表示运算优先。如果没有解决方案,则输出-1表示无解。
[基本要求]
(1)输入说明:在一行中给出4个整数,每个整数取值范围是[1, 13].
(2)输出说明:输出一种解决方案的表达式,用括号表示运算优先,如果没有解决方案,则输出-1。
(3)测试用例: 输入 2 3 12 12 输出 ((3-2)*12)+12
(4)可选要求:输入采用随机生成4个整数, 输出要求输出该4个整数所有可能的解决方案。
)
数据结构
使用栈操作,与深度搜索相结合
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
算法设计思想
设置两个函数,运用多重循环语句实现所有的数字和运算符排列组合的可能,同时不能重复,若重复则continue继续组合,依次判断各种组合的运算结果是否满足24,若满足则输出。
测试数据和结果
测试数据:随机生成四个数
结果:
算法时间复杂度
void Show_24 ( int a[] ) //对数字顺序进行排列组合
时间复杂度:O(nnnn)
int get_24(int i, int j, int k, int t) //对运算符进行排列组合
时间复杂度:O(nn*n)
代码如下:
#include <iostream>
#include<stdlib.h>
#include<fstream>
#include<string.h>
#include <iomanip>
#include<ctime>
using namespace std;
char YunSuan[5]= {'#','+','-','*','/',};
double cal(double x, double y, int YunSuan)
{
switch( YunSuan)
{
case 1:return x+y;
case 2:return x-y;
case 3:return x*y;
case 4:return x/y;
}
}
double reckon1(double i, double j, double k, double t, int a, int b, int c)//¼ÆËãģʽ
{
double r1, r2, r3;
r1 = cal(i, j, a);
r2 = cal(r1, k, b);
r3 = cal(r2, t, c);
return r3;
}
double reckon2(double i, double j, double k, double t, int a, int b, int c)
{
double r1, r2, r3 ;
r1 = cal(i, j, a);
r2 = cal(k, t, c);
r3 = cal(r1, r2, b);
return r3;
}
double reckon3(double i, double j, double k, double t, int a, int b, int c)
{
double r1, r2, r3;
r1 = cal(j, k, b);
r2 = cal(i, r1, a);
r3 = cal(r2, t, c);
return r3;
}
double reckon4(double i, double j, double k, double t, int a, int b, int c)
{
double r1, r2, r3 ;
r1 = cal(k, t, c);
r2 = cal(j, r1, b);
r3 = cal(i, r2, a);
return r3;
}
double reckon5(double i, double j, double k, double t, int a, int b, int c)
{
double r1, r2, r3;
r1 = cal(j, k, b);
r2 = cal(r1, t, c);
r3 = cal(i, r2, a);
return r3;
}
//对运算符进行排列组合
int get_24(int i, int j, int k, int t)
{
int a, b, c, flag=0;//a,b,c表示三种运算符
for ( a= 1; a <= 4; a++)
{
for ( b = 1; b <= 4; b++)
{
for ( c = 1; c <= 4; c++)
{
if (reckon1(i,j,k,t,a,b,c) == 24)
{
cout<< "(("<<i << YunSuan[a]<<j<<")"<< YunSuan[b] ;
cout<< k << ")" << YunSuan[c]<<t <<endl;
flag=1;
break;
}
if (reckon2(i,j,k,t,a,b,c) == 24)
{
cout<< "("<< i << YunSuan[a] << j <<")" << YunSuan[b] << "(";
cout<< k << YunSuan[c] << t << ")" <<endl;
flag=1;
break;
}
if (reckon3(i,j,k,t,a,b,c) == 24)
{
cout<<"("<< i << YunSuan[a] << "(" << j << YunSuan[b] ;
cout<< k <<")"<< YunSuan[c] << t <<endl;
flag=1;
break;
}
if (reckon4(i,j,k,t,a,b,c) == 24)
{
cout<< i << YunSuan[a] << "(" << j << YunSuan[b] ;
cout<< "("<<k << YunSuan[c] << t << "))" <<endl;
flag=1;
break;
}
if (reckon5(i,j,k,t,a,b,c) == 24)
{
cout<< i << YunSuan[a] << "((" << j << YunSuan[b] << k << ")";
cout<< YunSuan[c] << t << ")" <<endl;
flag=1;
break;
}
}
}
}
return flag;
}
//对数字顺序进行排列组合
void Show_24 ( int a[] )
{
int flag, i, j, k, h;
int t1, t2, t3, t4;
for(i = 0; i < 4; i++)
{
for( j = 0; j < 4; j++)
{
if( j == i )
continue;
for( k = 0; k < 4; k++)
{
if( i==k || j==k )
continue;
for( h = 0; h < 4; h++ )
{
if ( h==i || h==j || h==k )
continue;
t1 = a[i], t2= a[j], t3= a[k], t4= a[h];
flag = get_24(t1, t2, t3, t4);
if ( flag == 1 )
continue;
}
if( flag == 1 )
continue;
}
if( flag == 1 )
continue;
}
if(flag == 1)
continue;
}
}
int main()
{
int a[4];
int i;
time_t t;
srand((unsigned)time(&t));
for( i = 0; i < 4; i++)
{
a[i] = rand()%13+1;
cout<< a[i]<<" ";
}
cout<<endl;
Show_24 ( a );
return 0;
}