用撲克牌計算24點
阿新 • • 發佈:2021-01-11
用撲克牌計算24點(線性結構,陣列)
[問題描述]
一副撲克牌的每張牌表示一個數(J、Q、K分別表示11、12、13,兩個司令都表示6)。任取4張牌,即得到1-13的數,請新增運算子(規定為加、減、乘、除四種)使之成為運算式。每個數只能參與一次運算,4個數順序可以任意組合,4個運算子任意取3個且可以重複取。運算遵從一定有限級別,可加括號控制,最終使運算結果為24.請輸出一種解決方案的表示式,用括號表示運算優先。如果沒有解決方案,則輸出-1表示無解。
[基本要求]
(1)輸入說明:在一行中給出4個整數,每個整數取值範圍是[1, 13].
(2)輸出說明:輸出一種解決方案的表示式,用括號表示運算優先,如果沒有解決方案,則輸出-1。
(4)可選要求:輸入採用隨機生成4個整數, 輸出要求輸出該4個整數所有可能的解決方案。
)
資料結構
使用棧操作,與深度搜索相結合
typedef int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
演算法設計思想
設定兩個函式,運用多重迴圈語句實現所有的數字和運算子排列組合的可能,同時不能重複,若重複則continue繼續組合,依次判斷各種組合的運算結果是否滿足24,若滿足則輸出。
測試資料和結果
測試資料:隨機生成四個數
結果:
演算法時間複雜度
void Show_24 ( int a[] ) //對數字順序進行排列組合
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;
}