2011-02-08 22 views
2

我正在尋找一種算法,以確定當前的麻將手是否是贏家。如果你不熟悉遊戲,這裏的基本思想(簡體):麻將贏牌手算法

  • 有瓷磚的三套衣服,每個都包含瓷磚排名1-9。還有特殊的瓷磚,其中七種類型。每個瓷磚存在四份,因此每套西裝有36個瓷磚和28個特殊瓷磚。
  • 一隻手中有14塊瓷磚。
  • A chow是按順序排列的單排三個拼貼的集合。
  • A pong是一組三個相同的瓷磚。
  • A kong是一組四個相同的瓷磚。
  • A 是一組兩個相同的瓷磚。
  • 勝利的手是瓦片形成任何數量的chows,pongs和/或kongs和一對。

這隻手按照西裝,然後按等級排序。我的想法是這樣的:

  1. 將所有瓷磚標記爲未訪問和不合作。
  2. 訪問第一個未訪問的瓷磚。
  3. 檢查後續的拼貼,直到遇到食物,乒乓球或者拳擊,或者直到沒有可能。如果組合完成,將所有參與的瓷磚標爲已訪問並獲獎
  4. 如果已訪問所有瓷磚,請檢查是否所有瓷磚都獲勝。如果不是所有瓷磚都已訪問過,請轉到2.

問題是,一旦瓷磚是組合的一部分,就不能成爲任何其他組合的成員,這可能會使得手成爲贏家。

工作算法的任何想法?

+0

pong和kong是一樣的東西?你說他們都是「一組三塊相同的瓷磚」 – 2011-02-08 20:08:46

回答

0

如果將其嵌入回溯算法(http://en.wikipedia.org/wiki/Backtracking)中,則算法非常好。最簡單的方法是一旦找到匹配的pair/chow/...遞歸調用你的方法,但如果沒有,則放棄當前的選擇。在僞代碼,這看起來是這樣的:

1. Mark all tiles as nonwinning 
2. Call function Backtracking 

Function Backtracking: 
1. If all tiles are marked winning return WINNING else NONWINNING 
2. Visit tiles as described in your algorithm 
3. When found a chow/pong/... or the first pair  
    3.1. Mark those tiles as winning.  
    3.2. Afterwards call method Backtracking.  
    3.3. If return value of 3.2 is WINNING also return WINNING  
    3.4. Else unmark the tiles as nonwinning again  
4. If not finished search for pair/chow/... by looping to 3. 
5. All combinations are done and no winning movewas found so return NONWINNING 

背後的想法是,你第一次嘗試每對/ ...作爲一個勝負手的一部分,但如果這行不通只是假設它是嘗試同樣的不是勝利手的一部分。

如果您不僅對獲勝的手感興趣,而且還可以獲得所有可能的配對組合/組合/跳過步驟3.3中的返回。