1. 程式人生 > 其它 >用撲克牌計算24點

用撲克牌計算24點

技術標籤:演算法資料結構

用撲克牌計算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(n
n*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; }