24點遊戲設計
阿新 • • 發佈:2019-01-01
24點遊戲設計
問題描述:在數字1-13中隨機生成4個數字,運用加減乘除四則使4個數字的執行結果為24,每個數字僅能使用一次。
演算法設計:實現24點運算有如下兩種演算法。
演算法一窮舉法。所謂窮舉法就是列出4個數字加減乘除的各種可能性。我們可以將表示式分成以下幾種:首先我們將4個數設為a,b,c,d,,將其排序列出四個數的所有排序序列組合(共有A44=24種組合)。再進行符號的排列表達式,其中算術符號有+,—,*,/,(,)。其中有效的表示式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表示式。其中我們用列舉型別將符號定義成數字常量 。
演算法二是把多元運算轉化為兩元運算,先從四個數中取出兩個數進行運算,然後把運算結果和第三個數進行運算,再把結果與第四個數進行運算。在求表示式的過程中,最難處理的就是對括號的處理,而這種思路很好的避免了對括號的處理。
核心程式碼如下:
float Compute(char* str) { int i=0; float x; CharPush(m,';'); //初始化字元棧,中只有一個元素';',整數棧為空棧 while(str[i]&&i<SIZE-1) //處理中綴表示式迴圈 { x=0; if(str[i]==' ') { i++; continue; } while(str[i]>=48&&str[i]<=57) //1到10的ASCII碼值 { x=x*10+str[i]-48; //從螢幕上獲取的都是以字元的形式展現出來的,所以要ASCILL碼值都要減去48 ,這樣才能輸入多位數 i++; } if(x!=0) ValuePush(n,x); //如果x的值不等於 0那麼就進整數棧 else { int a=Prior2(str[i]); //處理棧外字元 int b=Prior(*(m.top-1)); //處理棧內字元,成員變數是字元棧中的棧頂元素 if(a>b) //棧外運算子優先順序高於棧內運算子優先順序 { CharPush(m,str[i]);i++;} //將其插入到字元棧中 else switch(CharPop(m)) //優先順序相反,括號裡面的引數變數是字元棧內的首元素 { case '+':x=ValuePop(n)+ValuePop(n); //從整數棧中丟擲兩個數值,進行以上的運算 ValuePush(n,x); break; case '-':x=ValuePop(n); x=ValuePop(n)-x; ValuePush(n,x);break; case '*':x=ValuePop(n)*ValuePop(n); ValuePush(n,x);break; case '/':x=ValuePop(n); if(x!=0.0) { x=ValuePop(n)/x; ValuePush(n,x); } else {cout<<"零不能做除數"<<endl;i=SIZE-1;} break; case '(':i++;break; case ';':i=SIZE-1;break; default:cout<<"====輸入有誤===="<<endl; } } } x=ValuePop(n); return x; }