二十四點

二十四點

二十四點是一種益智遊戲,它能在遊戲中鍛鍊人們的心算,它往往要求人們將四個或者五個數字進行加減乘除四則混合運算(允許使用括弧)求得二十四。

基本信息

二十四點是一種益智遊戲,它能在遊戲中鍛鍊人們的心算,它往往要求人們將四個數字進行加減乘除四則混合運算(允許使用括弧)求得二十四。

24點遊戲算法

利用計算程式來完成這個計算二十四點的程式
方法如下:
首先窮舉的可行性問題。我把表達式如下分成三類——
1、 無括弧的簡單表達式。
2、 有一個括弧的簡單表達式。
3、 有兩個括弧的較複雜表達式。
窮舉的開始我對給出的四個數進行排列,其可能的種數為4*3*2*1=24。我利用一個嵌套函式實現四個數的排列,算法如下:
/* ans[] 用來存放各種排列組合的數組*/
/* c[] 存放四張牌的數組 */
/* k[] c[]種四張牌的代號,其中k=I+1。
用它來代替c[]做處理,考慮到c[]中有可能出現相同數的情況 */
/* kans[] 暫存生成的排列組合 */
/* j 嵌套循環的次數 */
正如上面函式中提到的,在完成四張牌的排列之後,在表達式中添加運算符號。由於只有四張牌,所以只要添加三個運算符號就可以了。由於每一個運算符號可重複,所以計算出其可能的種數為4*4*4=64種。仍然利用嵌套函式實現添加運算符號的窮舉,算法如下:
/* ans[],j同上。sy[]存放四個運算符號。h為表達式形式。*/
好了,接下來我再考慮不同表達式的處理。剛才我已經將表達式分為三類,是因為添加三個括弧對於四張牌來說肯定是重複的。對於第一種,無括弧自然不用另行處理;而第二種情況由以下代碼可以得出其可能性有六種,其中還有一種是多餘的。
這個for循環給出了添加一個括弧的可能性的種數,其中m、n分別為添加在表達式中的左右括弧的位置。我所說的多餘的是指m=0,n=8,也就是放在表達式的兩端。這真是多此一舉,呵呵!最後一種情況是添加兩個括弧,我分析了一下,發現只可能是這種形式才不會是重複的——(a b)(c d)。為什麼不會出現嵌套括弧的情況呢?因為如果是嵌套括弧,那么外面的括弧肯定是包含三個數字的(四個沒有必要),也就是說這個括弧裡面包含了兩個運算符號,而這兩個運算符號是被另外一個括弧隔開的。那么如果這兩個運算符號是同一優先權的,則肯定可以通過一些轉換去掉括弧(你不妨舉一些例子來試試),也就是說這一個括弧沒有必要;如果這兩個運算符號不是同一優先權,也必然是這種形式((a+-b)*/c)。而*和/在這幾個運算符號中優先權最高,自然就沒有必要在它的外面添加括弧了。
綜上所述,所有可能的表達式的種數為24*64*(1+6+1)=12288種。哈哈,只有一萬多種可能性(這其中還有重複),這對於電腦來說可是小case喲!所以,對於窮舉的可行性分析和實現也就完成了。
接下來的問題就是如何對有符號的簡單表達式進行處理。這是棧的一個著名套用,那么什麼是棧呢?棧的概念是從日常生活中貨物在貨棧中的存取過程抽象出來的,即最後存放入棧的貨物(堆在靠出口處)先被提取出去,符合“先進後出,後進先出”的原則。這種結構猶如子彈夾。
在棧中,元素的插入稱為壓入(push)或入棧,元素的刪除稱為彈出(pop)或退棧。
棧的基本運算有三種,其中包括入棧運算、退棧運算以及讀棧頂元素,這些請參考相關數據結構資料。根據這些基本運算就可以用數組模擬出棧來。
那么作為棧的著名套用,表達式的計算可以有兩種方法。
第一種方法——
首先建立兩個棧,運算元棧OVS和運算符棧OPS。其中,運算元棧用來記憶表達式中的運算元,其棧頂指針為topv,初始時為空,即topv=0;運算符棧用來記憶表達式中的運算符,其棧頂指針為topp,初始時,棧中只有一個表達式結束符,即topp=1,且OPS(1)=‘;’。此處的‘;’即表達式結束符。
然後自左至右的掃描待處理的表達式,並假設當前掃描到的符號為W,根據不同的符號W做如下不同的處理:
1、 若W為運算元
2、 則將W壓入運算元棧OVS
3、 且繼續掃描下一個字元
4、 若W為運算符
5、 則根據運算符的性質做相應的處理:
(1)、若運算符為左括弧或者運算符的優先權大於運算符棧棧頂的運算符(即OPS(top)),則將運算符W壓入運算符棧OPS,並繼續掃描下一個字元。
(2)、若運算符W為表達式結束符‘;’且運算符棧棧頂的運算符也為表達式結束符(即OPS(topp)=’;’),則處理過程結束,此時,運算元棧棧頂元素(即OVS(topv))即為表達式的值。
(3)、若運算符W為右括弧且運算符棧棧頂的運算符為左括弧(即OPS(topp)=’(‘),則將左括弧從運算符棧談出,且繼續掃描下一個符號。
(4)、若運算符的右不大於運算符棧棧頂的運算符(即OPS(topp)),則從運算元棧OVS中彈出兩個運算元,設先後彈出的運算元為a、b,再從運算符棧OPS中彈出一個運算符,設為+,然後作運算a+b,並將運算結果壓入運算元棧OVS。本次的運算符下次將重新考慮。
第二種方法——
首先對表達式進行線性化,然後將線性表達式轉換成機器指令序列以便進行求值。
那么什麼是表達式的線性化呢?人們所習慣的表達式的表達方法稱為中綴表示。中綴表示的特點是運算符位於運算對象的中間。但這種表示方式,有時必須藉助括弧才能將運算順序表達清楚,而且處理也比較複雜。
1929年,波蘭邏輯學家Lukasiewicz提出一種不用括弧的邏輯符號體系,後來人們稱之為波蘭表示法(Polish notation)。波蘭表達式的特點是運算符位於運算對象的後面,因此稱為後綴表示。在對波蘭表達式進行運算,嚴格按照自左至右的順序進行。下面給出一些表達式及其相應的波蘭表達式。
表達式 波蘭表達式
A-B AB-
OK,所謂表達式的線性化是指將中綴表達的表達式轉化為波蘭表達式。對於每一個表達式,利用棧可以把表達式變換成波蘭表達式,也可以利用棧來計算波蘭表達式的值。
至於轉換和計算的過程和第一種方法大同小異,這裡就不再贅述了。
下面給出轉換和計算的具體實現程式——
這樣這個程式基本上就算解決了,回過頭來拿這個程式來算一算文章開始的那個問題。哈哈,算出來了,原來如此簡單——(6-3)*10-6=24。

計時制

24小時計時制二十四點指的是零點

同名手機遊戲

遊戲信息

套用類別: 棋牌天地
套用開發:ustb_20090830128_zhongjiahong
套用版本: 1.0.0.0
套用大小: 45.00 KB
套用語言: 中文
正版價格: 免費
支持平台:WinMobile 7.1

遊戲介紹

給出4正整數,系統就會推算出能得到24的數學式子。該遊戲僅供大家娛樂。

相關詞條

相關搜尋

熱門詞條

聯絡我們