24点游戏设计
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?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; }
總結
- 上一篇: html dom onblur,html
- 下一篇: Linux打印一个文字logo