C++實(shí)現(xiàn)經(jīng)典24點(diǎn)紙牌益智游戲
本文為大家分享了經(jīng)典24點(diǎn)紙牌益智游戲的具體實(shí)現(xiàn)方法,供大家參考,具體內(nèi)容如下
一.實(shí)驗(yàn)內(nèi)容
24點(diǎn)游戲是經(jīng)典的紙牌益智游戲。
常見游戲規(guī)則:
從撲克中每次取出4張牌。使用加減乘除,第一個(gè)能得出24者為贏。(其中,J代表11,Q代表12,K代表13,A代表1),按照要求編程解決24點(diǎn)游戲。
基本要求: 隨機(jī)生成4個(gè)代表撲克牌牌面的數(shù)字字母,程序自動(dòng)列出所有可能算出24的表達(dá)式,用擅長(zhǎng)的語言(C/C++/Java或其他均可)實(shí)現(xiàn)程序解決問題。
1.程序風(fēng)格良好(使用自定義注釋模板)
2.列出表達(dá)式無重復(fù)。
二.算法設(shè)計(jì)思路
算法描述:
1.通過rand()函數(shù)生成4個(gè)隨機(jī)數(shù)
2.通過F()函數(shù)進(jìn)行遞歸調(diào)用
3.首先將數(shù)組A中的兩個(gè)數(shù)進(jìn)行運(yùn)算,得到結(jié)果,然后通過遞歸調(diào)用將結(jié)果與下一個(gè)數(shù)字運(yùn)算,得到結(jié)果再通過遞歸調(diào)用,與最后一個(gè)數(shù)進(jìn)行運(yùn)算
4.遞歸過程中,判斷是否(n==1&&A[0]==24),滿足條件則輸出結(jié)果。最后通過count最終知道有多少種解法
三.代碼實(shí)現(xiàn)
#include<iostream> #include<stdlib.h> #include<math.h> #include<string.h> #include<ctime> using namespace std; int n=4; //三次運(yùn)算標(biāo)記值 double A[4]={0}; //存儲(chǔ)4個(gè)數(shù)字 char oper[4]={'+','-','*','/'}; //存儲(chǔ)運(yùn)算符 string B[4]; int count=0; int F(int n){ //判斷是否已完成三次運(yùn)算 if(n==1){ if(A[0]==24) //判斷結(jié)果是否為24 { cout<<B[0]<<endl; //如果是則輸出B[0]里蘊(yùn)含的整個(gè)表達(dá)式 count++; } } //遞歸實(shí)現(xiàn) //從數(shù)組中任意取出兩個(gè)數(shù)的組合 for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ double a,b; string x,y; a=A[i]; b=A[j]; A[j]=A[n-1]; //將最后一位數(shù)賦給A[j] x=B[i]; y=B[j]; B[j]=B[n-1]; //最后一位數(shù)字放入B[j]中 //加法 A[i]=a+b; //第一個(gè)空間保存前兩個(gè)數(shù)的運(yùn)算結(jié)果 B[i]='('+x+'+'+y+')'; //將運(yùn)算結(jié)果存入數(shù)組B中 F(n-1); //減法 //考慮兩種情況:1. a-b 2. b-a A[i]=a-b; B[i]='('+x+'-'+y+')'; F(n-1); A[i]=b-a; B[i]='('+y+'-'+x+')'; F(n-1); //乘法 A[i]=a*b; B[i]='('+x+'*'+y+')'; F(n-1); //除法 //考慮兩種情況:1. a/b 2. b/a 同時(shí)需要判斷分母不為零 if(b!=0){ A[i]=a/b; B[i]='('+x+'/'+y+')'; F(n-1); } if(a!=0){ A[i]=b/a; B[i]='('+y+'/'+x+')'; F(n-1); } //當(dāng)以上四則運(yùn)算的結(jié)果都不能滿足條件時(shí) //進(jìn)入下一個(gè)for循環(huán)之前, 需要將之前的i和j上的值都找回,即賦值 A[i]=a; A[j]=b; B[i]=x; B[j]=y; } } } class RandNum{ public: RandNum(){ srand(time(0)); } double get(int begin = 0, int end = 1){ return rand()%(end-begin+1)+begin; } }; int main(void) { RandNum r; for (int i = 0; i < 4; i++) { //生成4個(gè)1~13之間的數(shù)字 A[i]=r.get(1,13); //將生成的數(shù)字存入數(shù)組A中 cout<<A[i]<<" "; } cout<<endl; for(int i=0;i<4;i++){ if(A[i]==1) B[i]='A'; else if(A[i]==10) B[i]="10"; else if(A[i]==11) B[i]='J'; else if(A[i]==12) B[i]='Q'; else if(A[i]==13) B[i]='K'; else B[i]='0'+A[i]; } F(n); cout<<endl<<"總共有 "<<count<<" 種解法"<<endl; return 0; }
四.測(cè)試及運(yùn)行結(jié)果
五.經(jīng)驗(yàn)歸納
這次的程序設(shè)計(jì)采用了遞歸調(diào)用的方式,使得問題一步步化簡(jiǎn),即每次都是兩個(gè)數(shù)字進(jìn)行運(yùn)算,得到結(jié)果,結(jié)果再與下一個(gè)數(shù)字進(jìn)行運(yùn)算,直到滿足終止條件,結(jié)束遞歸。遞歸這種思想雖然很好寫出,但難以理解,尤其是對(duì)一些大型的算法。通過這次的程序設(shè)計(jì),我對(duì)遞歸有了更深的認(rèn)識(shí)。雖然遞歸的執(zhí)行效率很低,但是有一些問題必須使用遞歸解決,因此我會(huì)在以后的程序設(shè)計(jì)中經(jīng)常用到遞歸,提高對(duì)于遞歸的理解能力。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Qt編寫地圖之實(shí)現(xiàn)覆蓋物坐標(biāo)和搜索
地圖應(yīng)用中經(jīng)常會(huì)需要有覆蓋物坐標(biāo)和搜索的功能,本文將利用Qt實(shí)現(xiàn)這一功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-03-03OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解(推薦)
這篇文章主要介紹了c++實(shí)現(xiàn)單純形法現(xiàn)行規(guī)劃問題的求解,本文針對(duì)問題通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04C++ push方法與push_back方法的使用與區(qū)別
這篇文章主要介紹了C++ push方法與push_back方法的使用與區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12